From d3803e65808fd6edce548724f162618481fe2a09 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sun, 16 Aug 2020 09:12:11 +0300 Subject: [PATCH 01/83] Bump Golang to 1.15 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- go.mod | 2 +- go.sum | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c1a8aed..d7b12d4c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.14.x + go-version: 1.15.x - uses: actions/cache@v1 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 52f621bd..eab1aad6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.14.x + go-version: 1.15.x - uses: actions/cache@v1 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 23bad07c..3d454849 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.14.x + go-version: 1.15.x - uses: actions/cache@v1 with: diff --git a/go.mod b/go.mod index 744258b9..c4d7ac63 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/aerokube/selenoid - go 1.14 + go 1.15 require ( github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e diff --git a/go.sum b/go.sum index 8d34a115..2f69d907 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= From 7b1f19cfec216039f5b16b0c2d793c33154d77a6 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sun, 16 Aug 2020 09:17:20 +0300 Subject: [PATCH 02/83] Bump Alpine version to 3.12 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 692bafb5..14537395 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.8 +FROM alpine:3.12 RUN apk add -U ca-certificates tzdata mailcap && rm -Rf /var/cache/apk/* COPY selenoid /usr/bin From c3795a640890e6afb9f4ad9ae42390632413dc4e Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sat, 29 Aug 2020 12:08:46 +0300 Subject: [PATCH 03/83] Added new images for Chrome 85.0 and Opera 70.0 --- docs/browser-image-information.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/browser-image-information.adoc b/docs/browser-image-information.adoc index 2ac295bf..0ff38c0b 100644 --- a/docs/browser-image-information.adoc +++ b/docs/browser-image-information.adoc @@ -147,6 +147,7 @@ WARNING: Firefox 53.0+ images require Selenium client 3.4.0 or newer. | - | - | - | 82.0.x.x (release skipped by development team) | selenoid/chrome:83.0 | selenoid/vnc:chrome_83.0 | 83.0.4103.39 | 83.0.4103.61 | selenoid/chrome:84.0 | selenoid/vnc:chrome_84.0 | 84.0.4147.30 | 84.0.4147.89 +| selenoid/chrome:85.0 | selenoid/vnc:chrome_85.0 | 85.0.4183.87 | 85.0.4183.83 |=== [NOTE] @@ -248,6 +249,7 @@ We do not consider these images really stable. Many of base operations like work | selenoid/opera:67.0 | selenoid/vnc:opera_67.0 | 80.0.3987.100 | 67.0.3575.53 | selenoid/opera:68.0 | selenoid/vnc:opera_68.0 | 81.0.4044.113 | 68.0.3618.104 | selenoid/opera:69.0 | selenoid/vnc:opera_69.0 | 83.0.4103.97 | 69.0.3686.49 +| selenoid/opera:70.0 | selenoid/vnc:opera_70.0 | 84.0.4147.89 | 70.0.3728.133 |=== [NOTE] From 4a197bfb67a4d004a0498e933b0de82530818863 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 2 Sep 2020 14:10:22 +0300 Subject: [PATCH 04/83] Added new images for Firefox 80.0 --- docs/browser-image-information.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/browser-image-information.adoc b/docs/browser-image-information.adoc index 0ff38c0b..5a9ecb36 100644 --- a/docs/browser-image-information.adoc +++ b/docs/browser-image-information.adoc @@ -67,7 +67,7 @@ WARNING: Firefox 53.0+ images require Selenium client 3.4.0 or newer. |=== | Image | VNC Image | Selenoid Version | Geckodriver Version | Firefox Version | Client Version -| selenoid/firefox:48.0 | selenoid/vnc:firefox_48.0 | 1.10.0 | 0.13.0 | 48.0.2 (page load timeout, native events and proxies don't work) .32+<.^| +| selenoid/firefox:48.0 | selenoid/vnc:firefox_48.0 | 1.10.0 | 0.13.0 | 48.0.2 (page load timeout, native events and proxies don't work) .33+<.^| **Java, selenium-webdriver.js**: 3.4.0 and above **Python**: 3.5.0 and above | selenoid/firefox:49.0 | selenoid/vnc:firefox_49.0 | 1.10.0 | 0.13.0 | 49.0.2 (page load timeout, native events and switching between windows don't work) @@ -101,6 +101,7 @@ WARNING: Firefox 53.0+ images require Selenium client 3.4.0 or newer. | selenoid/firefox:77.0 | selenoid/vnc:firefox_77.0 | 1.10.0 | 0.26.0 | 77.0.1 | selenoid/firefox:78.0 | selenoid/vnc:firefox_78.0 | 1.10.0 | 0.26.0 | 78.0.1 | selenoid/firefox:79.0 | selenoid/vnc:firefox_79.0 | 1.10.0 | 0.27.0 | 79.0 +| selenoid/firefox:80.0 | selenoid/vnc:firefox_80.0 | 1.10.0 | 0.27.0 | 80.0 |=== From a5d4384982113cc176f03f3d657602ae9cd44bb4 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 21 Sep 2020 16:05:53 +0300 Subject: [PATCH 05/83] Updated Android images to recent emulator and Appium version --- docs/browser-image-information.adoc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/browser-image-information.adoc b/docs/browser-image-information.adoc index 5a9ecb36..6c2c1bfb 100644 --- a/docs/browser-image-information.adoc +++ b/docs/browser-image-information.adoc @@ -175,7 +175,7 @@ WARNING: Hardware server or virtual machine with nested virtualization support i |=== An example `browsers.json` for Chrome Mobile images looks like the following: -[source,javascript] +[source,json] ---- { "chrome": { @@ -271,16 +271,16 @@ WARNING: Hardware server or virtual machine with nested virtualization support i |=== | Image | Android version | Appium version -| selenoid/android:4.4 | 4.4 | 1.13.0 -| selenoid/android:5.0 | 5.0 | 1.13.0 -| selenoid/android:5.1 | 5.1 | 1.13.0 -| selenoid/android:6.0 | 6.0 | 1.13.0 -| selenoid/android:7.0 | 7.0 | 1.13.0 -| selenoid/android:7.1 | 7.1 | 1.13.0 -| selenoid/android:8.0 | 8.0 | 1.13.0 -| selenoid/android:8.1 | 8.1 | 1.13.0 -| selenoid/android:9.0 | 9.0 | 1.16.0 -| selenoid/android:10.0 | 10.0 | 1.16.0 +| selenoid/android:4.4 | 4.4 | 1.18.1 +| selenoid/android:5.0 | 5.0 | 1.18.1 +| selenoid/android:5.1 | 5.1 | 1.18.1 +| selenoid/android:6.0 | 6.0 | 1.18.1 +| selenoid/android:7.0 | 7.0 | 1.18.1 +| selenoid/android:7.1 | 7.1 | 1.18.1 +| selenoid/android:8.0 | 8.0 | 1.18.1 +| selenoid/android:8.1 | 8.1 | 1.18.1 +| selenoid/android:9.0 | 9.0 | 1.18.1 +| selenoid/android:10.0 | 10.0 | 1.18.1 |=== [NOTE] @@ -290,7 +290,7 @@ WARNING: Hardware server or virtual machine with nested virtualization support i ==== An example `browsers.json` for Android images looks like the following: -[source,javascript] +[source,json] ---- { "android": { From 53987d730219c5a547c5e4dcd06fd593f3682a94 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sat, 26 Sep 2020 12:03:25 +0300 Subject: [PATCH 06/83] Moved browser image information to separate documentation --- docs/browser-image-information.adoc | 308 +--------------------------- docs/index.adoc | 2 - 2 files changed, 1 insertion(+), 309 deletions(-) diff --git a/docs/browser-image-information.adoc b/docs/browser-image-information.adoc index 6c2c1bfb..9177407b 100644 --- a/docs/browser-image-information.adoc +++ b/docs/browser-image-information.adoc @@ -1,309 +1,3 @@ == Browser Image information -NOTE: Build files for all these images are open-sourced and stored in https://github.com/aerokube/selenoid-images[repository]. - -=== Firefox - -.Firefox Images with Selenium Server -|=== -| Image | VNC Image | Selenium Version | Firefox Version | Client Version - -| selenoid/firefox:3.6 | selenoid/vnc:firefox_3.6 | 2.20.0 | 3.6.16 i386 (dialogs may not work) .7+<.^| -**Java:** 2.53.1 and below -**Python:** not supported -**selenium-webdriver.js:** not supported -| selenoid/firefox:4.0 | selenoid/vnc:firefox_4.0 | 2.20.0 | 4.0.1 i386 -| selenoid/firefox:5.0 | selenoid/vnc:firefox_5.0 | 2.20.0 | 5.0.1 i386 -| selenoid/firefox:6.0 | selenoid/vnc:firefox_6.0 | 2.20.0 | 6.0.2 i386 -| selenoid/firefox:7.0 | selenoid/vnc:firefox_7.0 | 2.20.0 | 7.0.1 i386 -| selenoid/firefox:8.0 | selenoid/vnc:firefox_8.0 | 2.20.0 | 8.0.1 i386 -| selenoid/firefox:9.0 | selenoid/vnc:firefox_9.0 | 2.20.0 | 9.0.1 -| selenoid/firefox:10.0 | selenoid/vnc:firefox_10.0 | 2.32.0 | 10.0.2 .13+<.^| -**Java:** any modern version -**Python:** not supported -**selenium-webdriver.js:** not supported -| selenoid/firefox:11.0 | selenoid/vnc:firefox_11.0 | 2.32.0 | 11.0 -| selenoid/firefox:12.0 | selenoid/vnc:firefox_12.0 | 2.32.0 | 12.0 -| selenoid/firefox:13.0 | selenoid/vnc:firefox_13.0 | 2.32.0 | 13.0 -| selenoid/firefox:14.0 | selenoid/vnc:firefox_14.0 | 2.32.0 | 14.0.1 -| selenoid/firefox:15.0 | selenoid/vnc:firefox_15.0 | 2.32.0 | 15.0.1 -| selenoid/firefox:16.0 | selenoid/vnc:firefox_16.0 | 2.32.0 | 16.0.2 -| selenoid/firefox:17.0 | selenoid/vnc:firefox_17.0 | 2.32.0 | 17.0.1 -| selenoid/firefox:18.0 | selenoid/vnc:firefox_18.0 | 2.32.0 | 18.0.2 -| selenoid/firefox:19.0 | selenoid/vnc:firefox_19.0 | 2.32.0 | 19.0.2 -| selenoid/firefox:20.0 | selenoid/vnc:firefox_20.0 | 2.32.0 | 20.0 -| selenoid/firefox:21.0 | selenoid/vnc:firefox_21.0 | 2.32.0 | 21.0 -| selenoid/firefox:22.0 | selenoid/vnc:firefox_22.0 | 2.32.0 | 22.0 -| selenoid/firefox:23.0 | selenoid/vnc:firefox_23.0 | 2.35.0 | 23.0.1 .25+<.^| Any modern client version -| selenoid/firefox:24.0 | selenoid/vnc:firefox_24.0 | 2.39.0 | 24.0 -| selenoid/firefox:25.0 | selenoid/vnc:firefox_25.0 | 2.39.0 | 25.0.1 -| selenoid/firefox:26.0 | selenoid/vnc:firefox_26.0 | 2.39.0 | 26.0 -| selenoid/firefox:27.0 | selenoid/vnc:firefox_27.0 | 2.40.0 | 27.0.1 -| selenoid/firefox:28.0 | selenoid/vnc:firefox_28.0 | 2.41.0 | 28.0 -| selenoid/firefox:29.0 | selenoid/vnc:firefox_29.0 | 2.43.1 | 29.0.1 -| selenoid/firefox:30.0 | selenoid/vnc:firefox_30.0 | 2.43.1 | 30.0 -| selenoid/firefox:31.0 | selenoid/vnc:firefox_31.0 | 2.44.0 | 31.0 -| selenoid/firefox:32.0 | selenoid/vnc:firefox_32.0 | 2.44.0 | 32.0.3 -| selenoid/firefox:33.0 | selenoid/vnc:firefox_33.0 | 2.44.0 | 33.0.3 -| selenoid/firefox:34.0 | selenoid/vnc:firefox_34.0 | 2.45.0 | 34.0.5 -| selenoid/firefox:35.0 | selenoid/vnc:firefox_35.0 | 2.45.0 | 35.0.1 -| selenoid/firefox:36.0 | selenoid/vnc:firefox_36.0 | 2.45.0 | 36.0.1 -| selenoid/firefox:37.0 | selenoid/vnc:firefox_37.0 | 2.45.0 | 37.0.2 -| selenoid/firefox:38.0 | selenoid/vnc:firefox_38.0 | 2.45.0 | 38.0.5 -| selenoid/firefox:39.0 | selenoid/vnc:firefox_39.0 | 2.45.0 | 39.0.3 -| selenoid/firefox:40.0 | selenoid/vnc:firefox_40.0 | 2.45.0 | 40.0.3 -| selenoid/firefox:41.0 | selenoid/vnc:firefox_41.0 | 2.45.0 | 41.0.2 -| selenoid/firefox:42.0 | selenoid/vnc:firefox_42.0 | 2.47.1 | 42.0 -| selenoid/firefox:43.0 | selenoid/vnc:firefox_43.0 | 2.53.1 | 43.0.4 -| selenoid/firefox:44.0 | selenoid/vnc:firefox_44.0 | 2.53.1 | 44.0.2 -| selenoid/firefox:45.0 | selenoid/vnc:firefox_45.0 | 2.53.1 | 45.0.2 -| selenoid/firefox:46.0 | selenoid/vnc:firefox_46.0 | 2.53.1 | 46.0.1 -| selenoid/firefox:47.0 | selenoid/vnc:firefox_47.0 | 2.53.1 | 47.0.1 -|=== - -WARNING: Firefox 53.0+ images require Selenium client 3.4.0 or newer. - -.Firefox Images with Selenoid -|=== -| Image | VNC Image | Selenoid Version | Geckodriver Version | Firefox Version | Client Version - -| selenoid/firefox:48.0 | selenoid/vnc:firefox_48.0 | 1.10.0 | 0.13.0 | 48.0.2 (page load timeout, native events and proxies don't work) .33+<.^| -**Java, selenium-webdriver.js**: 3.4.0 and above -**Python**: 3.5.0 and above -| selenoid/firefox:49.0 | selenoid/vnc:firefox_49.0 | 1.10.0 | 0.13.0 | 49.0.2 (page load timeout, native events and switching between windows don't work) -| selenoid/firefox:50.0 | selenoid/vnc:firefox_50.0 | 1.10.0 | 0.13.0 | 50.0.2 (page load timeout, native events, switching windows and proxies don't work) -| selenoid/firefox:51.0 | selenoid/vnc:firefox_51.0 | 1.10.0 | 0.14.0 | 51.0.1 (page load timeout, native events, switching windows and proxies don't work) -| selenoid/firefox:52.0 | selenoid/vnc:firefox_52.0 | 1.10.0 | 0.15.0 | 52.0.2 (page load timeout, native events, switching windows and proxies don't work) -| selenoid/firefox:53.0 | selenoid/vnc:firefox_53.0 | 1.10.0 | 0.16.0 | 53.0.2 (switching windows may not work) -| selenoid/firefox:54.0 | selenoid/vnc:firefox_54.0 | 1.10.0 | 0.17.0 | 54.0.1 (switching windows may not work) -| selenoid/firefox:55.0 | selenoid/vnc:firefox_55.0 | 1.10.0 | 0.18.0 | 55.0.1 (switching windows may not work) -| selenoid/firefox:56.0 | selenoid/vnc:firefox_56.0 | 1.10.0 | 0.19.1 | 56.0.1 -| selenoid/firefox:57.0 | selenoid/vnc:firefox_57.0 | 1.10.0 | 0.19.1 | 57.0 -| selenoid/firefox:58.0 | selenoid/vnc:firefox_58.0 | 1.10.0 | 0.20.1 | 58.0 -| selenoid/firefox:59.0 | selenoid/vnc:firefox_59.0 | 1.10.0 | 0.20.1 | 59.0.1 -| selenoid/firefox:60.0 | selenoid/vnc:firefox_60.0 | 1.10.0 | 0.21.0 | 60.0.2 -| selenoid/firefox:61.0 | selenoid/vnc:firefox_61.0 | 1.10.0 | 0.21.0 | 61.0 -| selenoid/firefox:62.0 | selenoid/vnc:firefox_62.0 | 1.10.0 | 0.22.0 | 62.0 -| selenoid/firefox:63.0 | selenoid/vnc:firefox_63.0 | 1.8.1 | 0.23.0 | 63.0 -| selenoid/firefox:64.0 | selenoid/vnc:firefox_64.0 | 1.8.4 | 0.23.0 | 64.0 -| selenoid/firefox:65.0 | selenoid/vnc:firefox_65.0 | 1.9.0 | 0.24.0 | 65.0 -| selenoid/firefox:66.0 | selenoid/vnc:firefox_66.0 | 1.9.1 | 0.24.0 | 66.0.1 -| selenoid/firefox:67.0 | selenoid/vnc:firefox_67.0 | 1.9.1 | 0.24.0 | 67.0 -| selenoid/firefox:68.0 | selenoid/vnc:firefox_68.0 | 1.9.2 | 0.24.0 | 68.0 -| selenoid/firefox:69.0 | selenoid/vnc:firefox_69.0 | 1.9.2 | 0.24.0 | 69.0 -| selenoid/firefox:70.0 | selenoid/vnc:firefox_70.0 | 1.9.2 | 0.26.0 | 70.0 -| selenoid/firefox:71.0 | selenoid/vnc:firefox_71.0 | 1.9.3 | 0.26.0 | 71.0 -| selenoid/firefox:72.0 | selenoid/vnc:firefox_72.0 | 1.9.3 | 0.26.0 | 72.0 -| selenoid/firefox:73.0 | selenoid/vnc:firefox_73.0 | 1.10.0 | 0.26.0 | 73.0 -| selenoid/firefox:74.0 | selenoid/vnc:firefox_74.0 | 1.10.0 | 0.26.0 | 74.0.1 -| selenoid/firefox:75.0 | selenoid/vnc:firefox_75.0 | 1.10.0 | 0.26.0 | 75.0 -| selenoid/firefox:76.0 | selenoid/vnc:firefox_76.0 | 1.10.0 | 0.26.0 | 76.0 -| selenoid/firefox:77.0 | selenoid/vnc:firefox_77.0 | 1.10.0 | 0.26.0 | 77.0.1 -| selenoid/firefox:78.0 | selenoid/vnc:firefox_78.0 | 1.10.0 | 0.26.0 | 78.0.1 -| selenoid/firefox:79.0 | selenoid/vnc:firefox_79.0 | 1.10.0 | 0.27.0 | 79.0 -| selenoid/firefox:80.0 | selenoid/vnc:firefox_80.0 | 1.10.0 | 0.27.0 | 80.0 -|=== - - -=== Chrome - -.Chrome Images -|=== -| Image | VNC Image | Chromedriver version | Chrome version - -| selenoid/chrome:48.0 | selenoid/vnc:chrome_48.0 | 2.21 | 48.0.2564.116 -| selenoid/chrome:49.0 | selenoid/vnc:chrome_49.0 | 2.22 | 49.0.2623.112 -| selenoid/chrome:50.0 | selenoid/vnc:chrome_50.0 | 2.22 | 50.0.2661.102 -| selenoid/chrome:51.0 | selenoid/vnc:chrome_51.0 | 2.23 | 51.0.2704.106 -| selenoid/chrome:52.0 | selenoid/vnc:chrome_52.0 | 2.24 | 52.0.2743.116 -| selenoid/chrome:53.0 | selenoid/vnc:chrome_53.0 | 2.26 | 53.0.2785.143 -| selenoid/chrome:54.0 | selenoid/vnc:chrome_54.0 | 2.27 | 54.0.2840.100 -| selenoid/chrome:55.0 | selenoid/vnc:chrome_55.0 | 2.28 | 55.0.2883.87 -| selenoid/chrome:56.0 | selenoid/vnc:chrome_56.0 | 2.29 | 56.0.2924.87 -| selenoid/chrome:57.0 | selenoid/vnc:chrome_57.0 | 2.29 | 57.0.2987.110 -| selenoid/chrome:58.0 | selenoid/vnc:chrome_58.0 | 2.29 | 58.0.3029.81 -| selenoid/chrome:59.0 | selenoid/vnc:chrome_59.0 | 2.30 | 59.0.3071.86 -| selenoid/chrome:60.0 | selenoid/vnc:chrome_60.0 | 2.31 | 60.0.3112.90 -| selenoid/chrome:61.0 | selenoid/vnc:chrome_61.0 | 2.32 | 61.0.3163.79 -| selenoid/chrome:62.0 | selenoid/vnc:chrome_62.0 | 2.33 | 62.0.3202.62 -| selenoid/chrome:63.0 | selenoid/vnc:chrome_63.0 | 2.33 | 63.0.3239.84 -| selenoid/chrome:64.0 | selenoid/vnc:chrome_64.0 | 2.35 | 64.0.3282.119 -| selenoid/chrome:65.0 | selenoid/vnc:chrome_65.0 | 2.38 | 65.0.3325.181 -| selenoid/chrome:66.0 | selenoid/vnc:chrome_66.0 | 2.38 | 66.0.3359.117 -| selenoid/chrome:67.0 | selenoid/vnc:chrome_67.0 | 2.39 | 67.0.3396.62 -| selenoid/chrome:68.0 | selenoid/vnc:chrome_68.0 | 2.41 | 68.0.3440.106 -| selenoid/chrome:69.0 | selenoid/vnc:chrome_69.0 | 2.42 | 69.0.3497.100 -| selenoid/chrome:70.0 | selenoid/vnc:chrome_70.0 | 2.44 | 70.0.3538.110 -| selenoid/chrome:71.0 | selenoid/vnc:chrome_71.0 | 2.44 | 71.0.3578.80 -| selenoid/chrome:72.0 | selenoid/vnc:chrome_72.0 | 2.46 | 72.0.3626.121 -| selenoid/chrome:73.0 | selenoid/vnc:chrome_73.0 | 73.0.3683.68 | 73.0.3683.75 -| selenoid/chrome:74.0 | selenoid/vnc:chrome_74.0 | 74.0.3729.6 | 74.0.3729.157 -| selenoid/chrome:75.0 | selenoid/vnc:chrome_75.0 | 75.0.3770.90 | 75.0.3770.90 -| selenoid/chrome:76.0 | selenoid/vnc:chrome_76.0 | 76.0.3809.87 | 76.0.3809.68 -| selenoid/chrome:77.0 | selenoid/vnc:chrome_77.0 | 77.0.3865.40 | 77.0.3865.75 -| selenoid/chrome:78.0 | selenoid/vnc:chrome_78.0 | 78.0.3904.87 | 78.0.3904.70 -| selenoid/chrome:79.0 | selenoid/vnc:chrome_79.0 | 79.0.3945.36 | 79.0.3945.79 -| selenoid/chrome:80.0 | selenoid/vnc:chrome_80.0 | 80.0.3987.106 | 80.0.3987.132 -| selenoid/chrome:81.0 | selenoid/vnc:chrome_81.0 | 81.0.4044.138 | 81.0.4044.138 -| - | - | - | 82.0.x.x (release skipped by development team) -| selenoid/chrome:83.0 | selenoid/vnc:chrome_83.0 | 83.0.4103.39 | 83.0.4103.61 -| selenoid/chrome:84.0 | selenoid/vnc:chrome_84.0 | 84.0.4147.30 | 84.0.4147.89 -| selenoid/chrome:85.0 | selenoid/vnc:chrome_85.0 | 85.0.4183.87 | 85.0.4183.83 -|=== - -[NOTE] -==== -. These images work with any modern Selenium client version. -. Images for older Chrome versions were not built because we have no Debian packages. If you have such packages - we could create more images. -==== - -=== Chrome Mobile - -WARNING: Hardware server or virtual machine with nested virtualization support is required to run Chrome Mobile images. - -.Chrome Mobile Images -|=== -| Image | Android version | Appium version | Chromedriver version | Chrome version - -| selenoid/chrome-mobile:73.0 | 8.1 | 1.13.0 | 73.0.3683.68 | 73.0.3683.90 -| selenoid/chrome-mobile:74.0 | 8.1 | 1.13.0 | 74.0.3729.6 | 74.0.3729.157 -| selenoid/chrome-mobile:75.0 | 8.1 | 1.13.0 | 75.0.3770.8 | 75.0.3770.89 -| selenoid/chrome-mobile:76.0 | 9.0 | 1.16.0 | 76.0.3809.126 | 76.0.3809.132 -| selenoid/chrome-mobile:77.0 | 9.0 | 1.16.0 | 77.0.3865.40 | 77.0.3865.116 -| selenoid/chrome-mobile:78.0 | 9.0 | 1.16.0 | 78.0.3904.105 | 78.0.3904.96 -| selenoid/chrome-mobile:79.0 | 9.0 | 1.16.0 | 79.0.3945.36 | 79.0.3945.93 -|=== - -An example `browsers.json` for Chrome Mobile images looks like the following: -[source,json] ----- -{ - "chrome": { - "default": "mobile-75.0", - "versions": { - "mobile-75.0": { - "image": "selenoid/chrome-mobile:75.0", - "port": "4444", - "path": "/wd/hub" - } - } - } -} ----- - -=== Opera - -.Opera Presto Images -|=== -| Image | VNC Image | Selenium version | Opera version - -| selenoid/opera:12.16 | selenoid/vnc:opera_12.16 | 2.37.0 | 12.16.1860 (dialogs and probably async JS don't work) -|=== - -[WARNING] -==== -Due to bug in *Operadriver* to work with *Opera Blink* images you need to pass additional capability: -[source,javascript] -{"browserName": "opera", "operaOptions": {"binary": "/usr/bin/opera"}} - -We do not consider these images really stable. Many of base operations like working with proxies may not work. -==== - -.Opera Blink Images -|=== -| Image | VNC Image | Operadriver version | Opera version - -| selenoid/opera:33.0 | selenoid/vnc:opera_33.0 | 0.2.2 | 33.0.1990.115 -| selenoid/opera:34.0 | selenoid/vnc:opera_34.0 | 0.2.2 | 34.0.2036.50 -| selenoid/opera:35.0 | selenoid/vnc:opera_35.0 | 0.2.2 | 35.0.2066.92 -| selenoid/opera:36.0 | selenoid/vnc:opera_36.0 | 0.2.2 | 36.0.2130.65 -| selenoid/opera:37.0 | selenoid/vnc:opera_37.0 | 0.2.2 | 37.0.2178.54 -| selenoid/opera:38.0 | selenoid/vnc:opera_38.0 | 0.2.2 | 38.0.2220.41 -| selenoid/opera:39.0 | selenoid/vnc:opera_39.0 | 0.2.2 | 39.0.2256.71 -| selenoid/opera:40.0 | selenoid/vnc:opera_40.0 | 0.2.2 | 40.0.2308.90 -| selenoid/opera:41.0 | selenoid/vnc:opera_41.0 | 2.27 | 41.0.2353.69 -| selenoid/opera:42.0 | selenoid/vnc:opera_42.0 | 2.27 | 42.0.2393.94 -| selenoid/opera:43.0 | selenoid/vnc:opera_43.0 | 2.27 | 43.0.2442.991 -| selenoid/opera:44.0 | selenoid/vnc:opera_44.0 | 2.27 | 44.0.2510.857 -| selenoid/opera:45.0 | selenoid/vnc:opera_45.0 | 2.27 | 45.0.2552.635 -| selenoid/opera:46.0 | selenoid/vnc:opera_46.0 | 2.27 | 46.0.2597.26 -| selenoid/opera:47.0 | selenoid/vnc:opera_47.0 | 2.29 | 47.0.2631.39 -| selenoid/opera:48.0 | selenoid/vnc:opera_48.0 | 2.30 | 48.0.2685.35 -| selenoid/opera:49.0 | selenoid/vnc:opera_49.0 | 2.32 | 49.0.2725.39 -| selenoid/opera:50.0 | selenoid/vnc:opera_50.0 | 2.32 | 50.0.2762.45 -| selenoid/opera:51.0 | selenoid/vnc:opera_51.0 | 2.33 | 51.0.2830.26 -| selenoid/opera:52.0 | selenoid/vnc:opera_52.0 | 2.35 | 52.0.2871.37 -| selenoid/opera:53.0 | selenoid/vnc:opera_53.0 | 2.36 | 53.0.2907.68 -| selenoid/opera:54.0 | selenoid/vnc:opera_54.0 | 2.37 | 54.0.2952.46 -| selenoid/opera:55.0 | selenoid/vnc:opera_55.0 | 2.37 | 55.0.2994.37 -| selenoid/opera:56.0 | selenoid/vnc:opera_56.0 | 2.40 | 56.0.3051.31 -| selenoid/opera:57.0 | selenoid/vnc:opera_57.0 | 2.41 | 57.0.3098.76 -| selenoid/opera:58.0 | selenoid/vnc:opera_58.0 | 2.42 | 58.0.3135.79 -| - | - | - | 59.0.x.x (no stable release exists) -| selenoid/opera:60.0 | selenoid/vnc:opera_60.0 | 2.45 | 60.0.3255.56 -| - | - | - | 61.0.x.x (no stable release exists) -| selenoid/opera:62.0 | selenoid/vnc:opera_62.0 | 75.0.3770.100 | 62.0.3331.99 (need to use browserName = chrome) -| selenoid/opera:63.0 | selenoid/vnc:opera_63.0 | 76.0.3809.132 | 63.0.3368.91 -| selenoid/opera:64.0 | selenoid/vnc:opera_64.0 | 77.0.3865.120 | 64.0.3417.73 -| selenoid/opera:65.0 | selenoid/vnc:opera_65.0 | 78.0.3904.87 | 65.0.3467.42 -| selenoid/opera:66.0 | selenoid/vnc:opera_66.0 | 79.0.3945.79 | 66.0.3515.36 -| selenoid/opera:67.0 | selenoid/vnc:opera_67.0 | 80.0.3987.100 | 67.0.3575.53 -| selenoid/opera:68.0 | selenoid/vnc:opera_68.0 | 81.0.4044.113 | 68.0.3618.104 -| selenoid/opera:69.0 | selenoid/vnc:opera_69.0 | 83.0.4103.97 | 69.0.3686.49 -| selenoid/opera:70.0 | selenoid/vnc:opera_70.0 | 84.0.4147.89 | 70.0.3728.133 -|=== - -[NOTE] -==== -. These images work with any modern Selenium client version. -. Images for older Opera versions were not built because we have no Debian packages. If you have such packages - we could create more images. -==== - -=== Internet Explorer and Microsoft Edge - -We don't build ready to use images for these browsers because of Windows license limitations. However we provide detailed instructions on building such images https://github.com/aerokube/windows-images[here]. The same approach can be used for preparing images with Firefox, Chrome and Opera under Windows. - -=== Android - -WARNING: Hardware server or virtual machine with nested virtualization support is required to run Android images. - -.Android Images -|=== -| Image | Android version | Appium version - -| selenoid/android:4.4 | 4.4 | 1.18.1 -| selenoid/android:5.0 | 5.0 | 1.18.1 -| selenoid/android:5.1 | 5.1 | 1.18.1 -| selenoid/android:6.0 | 6.0 | 1.18.1 -| selenoid/android:7.0 | 7.0 | 1.18.1 -| selenoid/android:7.1 | 7.1 | 1.18.1 -| selenoid/android:8.0 | 8.0 | 1.18.1 -| selenoid/android:8.1 | 8.1 | 1.18.1 -| selenoid/android:9.0 | 9.0 | 1.18.1 -| selenoid/android:10.0 | 10.0 | 1.18.1 -|=== - -[NOTE] -==== -. These images include VNC server and Android Quick Boot snapshot. -. Neither Chromedriver nor Chrome Mobile are installed. To test hybrid apps build your own image using provided automation script. -==== - -An example `browsers.json` for Android images looks like the following: -[source,json] ----- -{ - "android": { - "default": "6.0", - "versions": { - "6.0": { - "image": "selenoid/android:6.0", - "port": "4444", - "path": "/wd/hub" - } - } - } -} ----- - -An example Java test can be found https://github.com/aerokube/demo-tests/blob/master/src/test/java/com/aerokube/selenoid/AndroidRemoteApkTest.java[here]. +Moved to a https://aerokube.com/images/latest/[dedicated page]. diff --git a/docs/index.adoc b/docs/index.adoc index 2f90e430..ab1c7b0a 100644 --- a/docs/index.adoc +++ b/docs/index.adoc @@ -22,8 +22,6 @@ It is using Docker to launch browsers. Please refer to https://github.com/aeroku include::quick-start-guide.adoc[leveloffset=+1] include::starting-selenoid-manually.adoc[leveloffset=+1] include::faq.adoc[leveloffset=+1] -include::windows.adoc[leveloffset=+1] -include::browser-images.adoc[leveloffset=+1] == Main Features include::video.adoc[leveloffset=+1] From 7e26f703907e5594d40d7d541b94b79587f57429 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sun, 27 Sep 2020 14:45:50 +0300 Subject: [PATCH 07/83] Removed CM bash script from Selenoid documentation --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cc5da93c..27b14e19 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,9 @@ Selenoid is a powerful implementation of [Selenium](http://github.com/SeleniumHQ ## Features ### One-command Installation -Start browser automation in minutes by copy-pasting just **one command**: +Start browser automation in minutes by downloading [Configuration Manager](https://github.com/aerokube/cm/releases) binary and running just **one command**: ``` -$ curl -s https://aerokube.com/cm/bash | bash \ - && ./cm selenoid start --vnc --tmpfs 128 +$ ./cm selenoid start --vnc --tmpfs 128 ``` **That's it!** You can now use Selenoid instead of Selenium server. Specify the following Selenium URL in tests: ``` From 30fc1a587af8943bd004c79aa712849b889eb6a2 Mon Sep 17 00:00:00 2001 From: Oleg Tolmashov Date: Thu, 1 Oct 2020 21:18:24 +0700 Subject: [PATCH 08/83] Handle http errors before changing queue stats (fixes #998) --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index e5f72e6a..846cab3f 100644 --- a/main.go +++ b/main.go @@ -242,7 +242,7 @@ var seleniumPaths = struct { func selenium() http.Handler { mux := http.NewServeMux() - mux.HandleFunc(seleniumPaths.CreateSession, queue.Try(queue.Check(queue.Protect(post(create))))) + mux.HandleFunc(seleniumPaths.CreateSession, post(queue.Try(queue.Check(queue.Protect(create))))) mux.HandleFunc(seleniumPaths.ProxySession, proxy) mux.HandleFunc(paths.Status, status) mux.HandleFunc(paths.Welcome, welcome) From e1c4a1a7efc9c419101724ae4d995f469c95bce8 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Thu, 19 Nov 2020 11:14:59 +0300 Subject: [PATCH 09/83] Replaced set-env instruction in Github Actions with safer one --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index eab1aad6..a3d3f43b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,7 +29,7 @@ jobs: run: ci/build.sh - name: Prepare release version - run: echo ::set-env name=RELEASE_VERSION::${GITHUB_REF:10} + run: echo "RELEASE_VERSION=${GITHUB_REF:10}" >> $GITHUB_ENV - uses: AButler/upload-release-assets@v2.0 with: From e89b7ab6c42b602bc897779b92512d35c59fe807 Mon Sep 17 00:00:00 2001 From: nebehr Date: Wed, 9 Dec 2020 15:00:33 +0300 Subject: [PATCH 10/83] Add Started to session data from /status (#1031) --- config/config.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/config.go b/config/config.go index 58a90248..9e555cdf 100644 --- a/config/config.go +++ b/config/config.go @@ -22,6 +22,7 @@ type Session struct { VNC bool `json:"vnc"` Screen string `json:"screen"` Caps session.Caps `json:"caps"` + Started time.Time `json:"started"` } // Sessions - used count and individual sessions for quota user @@ -182,6 +183,7 @@ func (config *Config) State(sessions *session.Map, limit, queued, pending int) * VNC: vnc, Screen: session.Caps.ScreenResolution, Caps: session.Caps, + Started: session.Started, } if ctr != nil { sess.Container = ctr.ID From b12baec92c6a5820921b3d7cf479abad24fbc5ca Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 17 Mar 2021 10:03:44 +0300 Subject: [PATCH 11/83] Timeout and capability fixes (fixes #867, fixes #916) --- selenoid.go | 13 ++++++++++++- selenoid_test.go | 23 +++++++++++++++++++++++ session/session.go | 4 ---- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/selenoid.go b/selenoid.go index d84a7f04..41222d95 100644 --- a/selenoid.go +++ b/selenoid.go @@ -199,11 +199,19 @@ func create(w http.ResponseWriter, r *http.Request) { } u := startedService.Url cancel := startedService.Cancel + + browser.Caps.ExtensionCapabilities = nil + browser.W3CCaps.Caps.ExtensionCapabilities = nil + for _, c := range browser.W3CCaps.FirstMatch { + c.ExtensionCapabilities = nil + } + var resp *http.Response i := 1 for ; ; i++ { r.URL.Host, r.URL.Path = u.Host, path.Join(u.Path, r.URL.Path) - req, _ := http.NewRequest(http.MethodPost, r.URL.String(), bytes.NewReader(body)) + newBody, _ := json.Marshal(browser) + req, _ := http.NewRequest(http.MethodPost, r.URL.String(), bytes.NewReader(newBody)) ctx, done := context.WithTimeout(r.Context(), newSessionAttemptTimeout) defer done() log.Printf("[%d] [SESSION_ATTEMPTED] [%s] [%d]", requestId, u.String(), i) @@ -495,6 +503,9 @@ func reverseProxy(hostFn func(sess *session.Session) string, status string) func sid, remainingPath := splitRequestPath(r.URL.Path) sess, ok := sessions.Get(sid) if ok { + sess.TimeoutCh = onTimeout(sess.Timeout, func() { + request{r}.session(sid).Delete(requestId) + }) (&httputil.ReverseProxy{ Director: func(r *http.Request) { r.URL.Scheme = "http" diff --git a/selenoid_test.go b/selenoid_test.go index c1836cfc..34fae77e 100644 --- a/selenoid_test.go +++ b/selenoid_test.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "fmt" + "github.com/aerokube/selenoid/session" "github.com/mafredri/cdp" "github.com/mafredri/cdp/rpcc" "io/ioutil" @@ -390,6 +391,28 @@ func TestSessionCreatedRedirect(t *testing.T) { queue.Release() } +func TestSessionCreatedRemoveExtensionCapabilities(t *testing.T) { + extensionCapsMissing := true + var browser struct { + W3CCaps struct { + Caps session.Caps `json:"alwaysMatch"` + } `json:"capabilities"` + } + + root := http.NewServeMux() + root.Handle("/wd/hub/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + err := json.NewDecoder(r.Body).Decode(&browser) + AssertThat(t, err, Is{nil}) + extensionCapsMissing = browser.W3CCaps.Caps.ExtensionCapabilities == nil + })) + manager = &HTTPTest{Handler: root} + + resp, err := httpClient.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(`{"capabilities":{"alwaysMatch":{"browserName": "firefox", "selenoid:options":{"enableVNC": true}}}}`))) + AssertThat(t, err, Is{nil}) + AssertThat(t, resp, Code{http.StatusOK}) + AssertThat(t, extensionCapsMissing, Is{true}) +} + func TestProxySession(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} diff --git a/session/session.go b/session/session.go index ca530585..3aa53936 100644 --- a/session/session.go +++ b/session/session.go @@ -49,10 +49,6 @@ func (c *Caps) ProcessExtensionCapabilities() { if c.ExtensionCapabilities != nil { mergo.Merge(c, *c.ExtensionCapabilities, mergo.WithOverride) //We probably need to handle returned error - - //According to Selenium standard vendor-specific capabilities for - //intermediary node should not be proxied to endpoint node - c.ExtensionCapabilities = nil } } From 6cb28fee5e4f15bbf89537c6f3c0984ae153deb9 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 17 Mar 2021 10:05:16 +0300 Subject: [PATCH 12/83] Bump Golang to 1.16 (fixes #1072) --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- go.mod | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d7b12d4c..2e48fdd5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.15.x + go-version: 1.16.x - uses: actions/cache@v1 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3d3f43b..218974d8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.15.x + go-version: 1.16.x - uses: actions/cache@v1 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3d454849..f5455121 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.15.x + go-version: 1.16.x - uses: actions/cache@v1 with: diff --git a/go.mod b/go.mod index c4d7ac63..db4e24cc 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/aerokube/selenoid - go 1.15 +go 1.16 require ( github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e From 40e2aea5488e56432b24ef92d4cb0bfdb7b9d468 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 17 Mar 2021 10:07:11 +0300 Subject: [PATCH 13/83] Running Selenoid container from non-root user (fixes #1060) --- Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 14537395..32e8269a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,9 @@ -FROM alpine:3.12 +FROM alpine:3 RUN apk add -U ca-certificates tzdata mailcap && rm -Rf /var/cache/apk/* COPY selenoid /usr/bin EXPOSE 4444 ENTRYPOINT ["/usr/bin/selenoid", "-listen", ":4444", "-conf", "/etc/selenoid/browsers.json", "-video-output-dir", "/opt/selenoid/video/"] + +USER 4096:4096 From 69405aefa6caab1adcce0cc48d971aa0ba492692 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 17 Mar 2021 10:11:02 +0300 Subject: [PATCH 14/83] Completely removed `pwd` from documentation (fixes #1073) --- docs/contributing.adoc | 2 +- docs/logs.adoc | 4 ++-- docs/starting-selenoid-manually.adoc | 2 +- docs/video.adoc | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/contributing.adoc b/docs/contributing.adoc index 4f810785..080c3903 100644 --- a/docs/contributing.adoc +++ b/docs/contributing.adoc @@ -42,7 +42,7 @@ Locally can be generated with: [source,bash] ---- -$ docker run --rm -v `pwd`/docs/:/documents/ \ +$ docker run --rm -v ./docs/:/documents/ \ asciidoctor/docker-asciidoctor \ asciidoctor -D /documents/output/ index.adoc ---- diff --git a/docs/logs.adoc b/docs/logs.adoc index a3fd0a1e..df37632a 100644 --- a/docs/logs.adoc +++ b/docs/logs.adoc @@ -19,8 +19,8 @@ $ docker run -d --name selenoid \ -p 4444:4444 \ -v /var/run/docker.sock:/var/run/docker.sock \ --v `pwd`/config/:/etc/selenoid/:ro \ --v `pwd`/logs/:/opt/selenoid/logs/ \ +-v /your/directory/config/:/etc/selenoid/:ro \ +-v /your/directory/logs/:/opt/selenoid/logs/ \ aerokube/selenoid:latest-release -log-output-dir /opt/selenoid/logs ---- diff --git a/docs/starting-selenoid-manually.adoc b/docs/starting-selenoid-manually.adoc index 4ad79a0e..b16a9504 100644 --- a/docs/starting-selenoid-manually.adoc +++ b/docs/starting-selenoid-manually.adoc @@ -107,7 +107,7 @@ docker run -d \ --name selenoid \ -p 4444:4444 \ -v /var/run/docker.sock:/var/run/docker.sock \ --v `pwd`/config/:/etc/selenoid/:ro \ +-v ./config/:/etc/selenoid/:ro \ aerokube/selenoid:latest-release ---- diff --git a/docs/video.adoc b/docs/video.adoc index 5e5dc82a..bfe5bb06 100644 --- a/docs/video.adoc +++ b/docs/video.adoc @@ -21,7 +21,7 @@ $ docker pull selenoid/video-recorder:latest-release . When running Selenoid **in Docker container**: .. Mount a directory from the host machine (e.g. `~/.aerokube/selenoid/video`) to store video files to `/opt/selenoid/video`. .. Pass an additional `OVERRIDE_VIDEO_OUTPUT_DIR` environment variable with absolute path to video directory on host machine. This is required because video recorder container, automatically created by Selenoid should save video to host machine video storage directory. -. When running Selenoid **as a binary** - videos will be stored in `video` directory inside current working directory. +. When running Selenoid **as a binary** - videos will be stored in `video` directory inside current working directory. + .Example Docker Command ---- @@ -29,9 +29,9 @@ $ docker run -d \ --name selenoid \ -p 4444:4444 \ -v /var/run/docker.sock:/var/run/docker.sock \ --v `pwd`/config/:/etc/selenoid/:ro \ --v `pwd`/video/:/opt/selenoid/video/ \ --e OVERRIDE_VIDEO_OUTPUT_DIR=`pwd`/video/ \ +-v /your/directory/config/:/etc/selenoid/:ro \ +-v /your/directory/video/:/opt/selenoid/video/ \ +-e OVERRIDE_VIDEO_OUTPUT_DIR=/your/directory/video/ \ aerokube/selenoid:latest-release ---- From eebc4bb3bbe3546f506d18b6c1972785450682f7 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 24 Mar 2021 10:18:06 +0300 Subject: [PATCH 15/83] Reverted Dockerfile USER change --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 32e8269a..5a03836c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,5 +5,3 @@ COPY selenoid /usr/bin EXPOSE 4444 ENTRYPOINT ["/usr/bin/selenoid", "-listen", ":4444", "-conf", "/etc/selenoid/browsers.json", "-video-output-dir", "/opt/selenoid/video/"] - -USER 4096:4096 From bc819b42956a243b64ed3c68e9c5accd031df02d Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Fri, 26 Mar 2021 11:12:27 +0300 Subject: [PATCH 16/83] Removing only selenoid:options and preserving stuff like goog:chromeOptions (fixes #1077) --- selenoid.go | 39 ++++++++++++++++++++++++++++++++------- selenoid_test.go | 24 ++++++++++++++++++------ 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/selenoid.go b/selenoid.go index 41222d95..49987313 100644 --- a/selenoid.go +++ b/selenoid.go @@ -200,17 +200,11 @@ func create(w http.ResponseWriter, r *http.Request) { u := startedService.Url cancel := startedService.Cancel - browser.Caps.ExtensionCapabilities = nil - browser.W3CCaps.Caps.ExtensionCapabilities = nil - for _, c := range browser.W3CCaps.FirstMatch { - c.ExtensionCapabilities = nil - } - var resp *http.Response i := 1 for ; ; i++ { r.URL.Host, r.URL.Path = u.Host, path.Join(u.Path, r.URL.Path) - newBody, _ := json.Marshal(browser) + newBody := removeSelenoidOptions(body) req, _ := http.NewRequest(http.MethodPost, r.URL.String(), bytes.NewReader(newBody)) ctx, done := context.WithTimeout(r.Context(), newSessionAttemptTimeout) defer done() @@ -357,6 +351,37 @@ func create(w http.ResponseWriter, r *http.Request) { log.Printf("[%d] [SESSION_CREATED] [%s] [%d] [%.2fs]", requestId, s.ID, i, util.SecondsSince(sessionStartTime)) } +func removeSelenoidOptions(input []byte) []byte { + body := make(map[string]interface{}) + _ = json.Unmarshal(input, &body) + const selenoidOptions = "selenoid:options" + if raw, ok := body["desiredCapabilities"]; ok { + if dc, ok := raw.(map[string]interface{}); ok { + delete(dc, selenoidOptions) + } + } + if raw, ok := body["capabilities"]; ok { + if c, ok := raw.(map[string]interface{}); ok { + if raw, ok := c["alwaysMatch"]; ok { + if am, ok := raw.(map[string]interface{}); ok { + delete(am, selenoidOptions) + } + } + if raw, ok := c["firstMatch"]; ok { + if fm, ok := raw.([]interface{}); ok { + for _, raw := range fm { + if c, ok := raw.(map[string]interface{}); ok { + delete(c, selenoidOptions) + } + } + } + } + } + } + ret, _ := json.Marshal(body) + return ret +} + func preprocessSessionId(sid string) string { if ggrHost != nil { return ggrHost.Sum() + sid diff --git a/selenoid_test.go b/selenoid_test.go index 34fae77e..057c2202 100644 --- a/selenoid_test.go +++ b/selenoid_test.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "fmt" - "github.com/aerokube/selenoid/session" "github.com/mafredri/cdp" "github.com/mafredri/cdp/rpcc" "io/ioutil" @@ -392,10 +391,16 @@ func TestSessionCreatedRedirect(t *testing.T) { } func TestSessionCreatedRemoveExtensionCapabilities(t *testing.T) { - extensionCapsMissing := true + desiredCapabilitiesPresent := true + alwaysMatchPresent := true + firstMatchPresent := true + chromeOptionsPresent := true + var browser struct { + Caps map[string]interface{} `json:"desiredCapabilities"` W3CCaps struct { - Caps session.Caps `json:"alwaysMatch"` + AlwaysMatch map[string]interface{} `json:"alwaysMatch"` + FirstMatch []map[string]interface{} `json:"firstMatch"` } `json:"capabilities"` } @@ -403,14 +408,21 @@ func TestSessionCreatedRemoveExtensionCapabilities(t *testing.T) { root.Handle("/wd/hub/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { err := json.NewDecoder(r.Body).Decode(&browser) AssertThat(t, err, Is{nil}) - extensionCapsMissing = browser.W3CCaps.Caps.ExtensionCapabilities == nil + _, desiredCapabilitiesPresent = browser.Caps["selenoid:options"] + _, alwaysMatchPresent = browser.W3CCaps.AlwaysMatch["selenoid:options"] + _, chromeOptionsPresent = browser.W3CCaps.AlwaysMatch["goog:chromeOptions"] + AssertThat(t, len(browser.W3CCaps.FirstMatch), EqualTo{1}) + _, firstMatchPresent = browser.W3CCaps.FirstMatch[0]["selenoid:options"] })) manager = &HTTPTest{Handler: root} - resp, err := httpClient.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(`{"capabilities":{"alwaysMatch":{"browserName": "firefox", "selenoid:options":{"enableVNC": true}}}}`))) + resp, err := httpClient.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(`{"desiredCapabilities": {"browserName": "chrome", "selenoid:options": {"enableVNC": true}}, "capabilities":{"alwaysMatch":{"browserName": "chrome", "goog:chromeOptions": {"args": ["headless"]}, "selenoid:options":{"enableVNC": true}}, "firstMatch": [{"platform": "linux", "selenoid:options": {"enableVideo": true}}]}}`))) AssertThat(t, err, Is{nil}) AssertThat(t, resp, Code{http.StatusOK}) - AssertThat(t, extensionCapsMissing, Is{true}) + AssertThat(t, desiredCapabilitiesPresent, Is{false}) + AssertThat(t, alwaysMatchPresent, Is{false}) + AssertThat(t, chromeOptionsPresent, Is{true}) + AssertThat(t, firstMatchPresent, Is{false}) } func TestProxySession(t *testing.T) { From b15a59f974c0d67ffc56f3dfecf024fd1e01abfc Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Fri, 16 Apr 2021 07:08:57 +0300 Subject: [PATCH 17/83] Added riadvice logo to README.md --- README.md | 2 +- docs/img/logo/riadvice.png | Bin 0 -> 10289 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/img/logo/riadvice.png diff --git a/README.md b/README.md index 27b14e19..6eff865e 100644 --- a/README.md +++ b/README.md @@ -66,5 +66,5 @@ Selenoid was initially created to be deployed on hardware servers or virtual mac ## Known Users -[![JetBrains](docs/img/logo/jetbrains.png)](http://jetbrains.com/) [![Yandex](docs/img/logo/yandex.png)](https://yandex.com/company/) [![Sberbank Technology](docs/img/logo/sbertech.png)](http://sber-tech.com/) [![ThoughtWorks](docs/img/logo/thoughtworks.png)](https://thoughtworks.com/) [![VK.com](docs/img/logo/vk.png)](https://vk.com/) [![SuperJob](docs/img/logo/superjob.png)](http://superjob.ru/) [![PropellerAds](docs/img/logo/propellerads.png)](http://propellerads.com/) [![AlfaBank](docs/img/logo/alfabank.png)](https://alfabank.com/) [![3CX](docs/img/logo/3cx.png)](https://www.3cx.com/) [![IQ Option](docs/img/logo/iq_option.png)](https://iqoption.com/) [![Mail.Ru Group](docs/img/logo/mail_ru.png)](https://corp.mail.ru/en/) [![Newegg.Com](docs/img/logo/newegg.png)](https://newegg.com/) [![Badoo](docs/img/logo/badoo.png)](https://badoo.com/team/) [![BCS](docs/img/logo/bcs.png)](https://bcs.ru/) [![Quality Lab](docs/img/logo/quality-lab.png)](https://quality-lab.ru) [![AT Consulting](docs/img/logo/at-consulting.png)](https://www.at-consulting.ru/) [![Royal Caribbean International](docs/img/logo/royal-caribbean.png)](https://www.royalcaribbean.com/) [![Sixt](docs/img/logo/sixt.png)](https://sixt.com/) [![Testjar](docs/img/logo/testjar.png)](http://www.testjar.com/) [![Flipdish](docs/img/logo/flipdish.png)](https://www.flipdish.com/) +[![JetBrains](docs/img/logo/jetbrains.png)](http://jetbrains.com/) [![Yandex](docs/img/logo/yandex.png)](https://yandex.com/company/) [![Sberbank Technology](docs/img/logo/sbertech.png)](http://sber-tech.com/) [![ThoughtWorks](docs/img/logo/thoughtworks.png)](https://thoughtworks.com/) [![VK.com](docs/img/logo/vk.png)](https://vk.com/) [![SuperJob](docs/img/logo/superjob.png)](http://superjob.ru/) [![PropellerAds](docs/img/logo/propellerads.png)](http://propellerads.com/) [![AlfaBank](docs/img/logo/alfabank.png)](https://alfabank.com/) [![3CX](docs/img/logo/3cx.png)](https://www.3cx.com/) [![IQ Option](docs/img/logo/iq_option.png)](https://iqoption.com/) [![Mail.Ru Group](docs/img/logo/mail_ru.png)](https://corp.mail.ru/en/) [![Newegg.Com](docs/img/logo/newegg.png)](https://newegg.com/) [![Badoo](docs/img/logo/badoo.png)](https://badoo.com/team/) [![BCS](docs/img/logo/bcs.png)](https://bcs.ru/) [![Quality Lab](docs/img/logo/quality-lab.png)](https://quality-lab.ru) [![AT Consulting](docs/img/logo/at-consulting.png)](https://www.at-consulting.ru/) [![Royal Caribbean International](docs/img/logo/royal-caribbean.png)](https://www.royalcaribbean.com/) [![Sixt](docs/img/logo/sixt.png)](https://sixt.com/) [![Testjar](docs/img/logo/testjar.png)](http://www.testjar.com/) [![Flipdish](docs/img/logo/flipdish.png)](https://www.flipdish.com/) [![RiAdvice](docs/img/logo/riadvice.png)](https://riadvice.tn/) diff --git a/docs/img/logo/riadvice.png b/docs/img/logo/riadvice.png new file mode 100644 index 0000000000000000000000000000000000000000..34e1248b38ef5a56a3c06263e63fe2c343d63b40 GIT binary patch literal 10289 zcmcI~hg%cR_jM9F(tAf~p^5>e7o|#7j%!Bp}j3k={Gfk(N+|0HI3}1e6-O zNQ)rS;g`?%{TtpVn`EEaeeT}5bNAeHW+wKTz9uC(8#w>~pwxP*W&{9$eDUY6NQv>k z`&X@m_&;KM9ZfaB?SG%bFBKp0Eo9KAmiXK5(Es-Z0i@QoyXT6*dvn}jrk#2l{a z5eopoU4WL_6O+LC{k(uo)Bf{8F)mc&Q-JuKgTgw%iPv54XOXJOw45`OWxbco15Jp60Odb_8r??KyXe#d24{4vyyYea1xC)HbW@-xu<$!56HQVg(RYd6HZ5o<<6`G;-{Q|!QRSU4}GoxM69E^Vd zS)=nB(J_>x_b#(l*0UG_{v~?B6kp)f`v0EO^jOPkD0Z@)?3a1b;Kotbo|y2j|M^&9 znKnY&{u~}%h5MA}+uuu{z5buEI9YWq4GfTiV7YS5!JI_t`-v~USvx=-e?Nxi2`oH~ z`!Yr!DU5Fv-eM@D&{h#H7+wa{m~Rf&XH2}RH-1uq?}eYaU$&{1_GBU;KQ8E!2Me(i zxy#;UbC4&(bYQ~$Kdw(oPjCKw!08|5XjGgk>NppcUMX)V5QNkC*H$a8uV!bLeuC#m@0Q%tI2PzpciU{A? zehIcyXb{E8(ttkF#RTxtU~QPi2tCuP&Gtz5$SE=;3Pbz5OO$92%$s+MC6vDZMmPJfeG$`3yH_xLBTz6bHHZpZQlSY`<=c|{sb@bB z5;P*bBx}XYV>e2lTSc4_Nk4`5K-v~Erl{|I-qALyX)j5M+SvxNYf26uCz zEm&FHzQp_I*=U4$QGK0Js2MtWRjK6flywL0Wj0{%D}{guh@KshLCsNs-t7ADD5G__e7qBh>CFPPEhqO#y2GdNZ&ID znEfieK2IinX7~41HlT9`blE!c750 z)uztTf^`?WaBNCyRuAFlI3%}+#PnXLBptwG1vl23l}Xeo0@R3>cRP%dOor0LV@^*= zS2Uw+W@L(6GOa0{Rm@WyRFfN6lN+kPuQ{p>J>NNh!Jjn2c*pBPLBw2ClxKMW0Xxpx z(|hz+8Ck`2t@ev-5s|Z|73YXM{(K%PJ+$3|P!4%}%DIO(EdQYARE{<9ZJ_*qnwP{P z?;i4DN7X=iEqk+hS&?xD|M2R^4B6y{M?V>}CSFMo?rR@8`qWvV_>vk%81HZcDlmat zVduL3eu@6A_h*U=1hfB4R~WZ#6Q07!u*;`#giXf0P)Pr5@Bj(e#x}mwh+tu9k@ zrVWdKJ3Sr=IlT0grS@2jJdnp62mC!`+n5oux)PC+v64pwvpVao7eG72I_Nr9uWHVH zoZ?no1fjKNX&B3xW3nC9Pe08V?~BK_?Hb10@c)wFJr5PQw9ajMZJUITfn$6n6Vn$D z`$Z)_{JYhqF$?4mIxx7K;C&_N|bNv`o?Ap3YOsViZxe+0;Zdz zumDuYcZOVavZh*)9abumE-1(l{ehO_-EE2h>IgW(?QL;cd2s_-Git@F;}ENguHv7 z$6j7fchJKrM$)656nVbsG&T^2)4`+}5R9MniRIHOP%5YmQb~94`g$ipz=NGDgVI0U z&>E&RzKN(u8l!_l@i!*FUf1ILP0{dW+v5)OX4@5Fw8*vn0H$6mP(yLWJ-#{U3R$<{ zar80Fa`~ANsHw$Cbyb$s-Lr)8jZsLg*B`?%5~}jNh!b)NI5I z9-6y)T|}_kM}XWkcbduE#$)Ra5w{UEbcy9uzc-J;@O}nhZ~!G9?OXT4D}kgg!F$CF z^}OEu)4R-$J4nNRWNk3%_S>!X+j{Flsf?MBZilW6A%_8yRPdsabH? z1`xn?OoqzdokHD^U7QXZ-2|Q_VQn0m3ew~!D2E_fY$MC*(u;TRtBI@oX?(C(PY%je z^moYZJ;!2RD)(@9)%bZIWw}S5ee94M*gxHli}JOKt*K_$fJyN@ z;TM>;!OR111L_p{OaC#JQ;L2u*-B=Kly0RQf@}mUYUkHO2gSbd2>Bwrb~DAY>X^1q zC9BB~JKCe(6KsoJ53?Y{srHN$^@#b4GDVo~^DQTJR^VY^ z*YSQ!jJ0Yj!5^uO?-9G+>@uOR3zZbkz4nFlNlJFtQtu0F6}R(Qsy9{d-jSu%O2)kY z3v7)KK5*?_^Ic(~^p(Ul=p)PHoLFhj;-dBFf^WWH7GMEl-zI`<866N1$iXFKoKq+J zXY4QbW;W<_Rov7jW-)}ekBV5sH67-04_}fE63+7mx8kDas`5N(9c)2;_7)sc6V8p& z%`{Qka+z@}br^1ev%PBs(qU1WzyG|ADr~zh{p`+oc7}hbelQAjmSF}dtNsQ*p8IBMnegA1F;l(bxoiQ*&5jxvDOZj6OWvsGQ?Drk2&gi=UFyK4ei&jfb zJn1|n&sAN1$f3rKaj!_`z24opF+WkHAP=7uHl?Q`)aTC^5!%erO;dQ&w5cq$=KoKj z_ar?P*x6m3kJ_Z$ndjvzM;*TE5IZL%`^)Q`|J z__bxN_WqirL&FQAd}XTJ=U0mAZ>45s4rjsnQMe~q1DJ_MXbmpFHLXgH81*E|rr4dh z^GUT{Wull|p3_*#4~jlZ|M42td(!U%m$8Rm8Sj`^?7#8p2esL+@_*Jo^U+ZHcX ze6I8M!KvGcOGbCdY>##W+s!tzF5#9oR_j=H$dMbSgf#O@Mz=;)K*OF=M`?cPK+WquXI-@xg1cmT$> z48%d%Sr)XdcV908&ycx@IcNtP@ucndKT;%6_UsLfL}EJ;ti;4+HewJy-Ts(0Xo`35pH*4v{azNUbG^Syj*kFHRj3ZDV^X=4 zCu0|ybF~p(UmmGkiIcosolQTJ8n^@ms8LvdUhl-$3YXuV8O|5n!;E)2{LE zohHYBKWKAq&)9Z_r1t+a0Lr_zRI!yHNO<1mB{l_Di+mivOpAZ*px0XeAS>4Q?S=Fr z=+>3AO zgyyQg!L0+>qRvg3e1;0$C~n3P$(UNN4kg6HPMRjl<@a^I35yx1G4U+Ymztnag5&1k zvZPzkrHfRmbmQ^n-AalyzZh9+84?REjTez+w7QWe_Vib?FDPqa5qLm1SmO+6W}8fV zYvZDdDL?DT`jzb2QZJA}`=;jt!&dgkY|)6p_9h$s_>7|1I?Vb=e$A3$dIWS8s&!*g zonCA|o=6Bz*=tXpYX8WJz9+$UD3UnCQMK-a&L|x3@~vlCad)q?uvlcAiyfBV#|GtO z-&SkdV!>RiUezzHsKNQ%Z9_@x?8ye_;mfefFDtV)I{UnkJ2E}%QYY-@Ul4;P6CwH4FN1TS zyAz=XY?hIMU0j#g^3u?(=;NR{#zuE=XHPny49c+aH*U5)(vLCR9;pklk$%>yP3U{ zG^>m)Yl&zLWhhm`jIaf5dC=P>QVZKAQ6&$txNgdAb}=C;kmvWBy4u$t3aIgAu?Wpw zx-R6+3)QZ(I4g{AyBC|S+{ACIzq&i^m<*`EvodDkTyX*i(yU-7nFb(^zy)I-!#dF_ z6pG};!Ogybfo^(x4O6177MwPFrw#kX?;#y=eW0;oo+#xOV`}DNayFj56mja zJ8x47cT--hbmr@Od&>#-1X!udwaWZS)HTf4J$-tL&763Rw%l$G;|sCOoxYN>sXI6S zysJJha|CT6eX^Viwejo{~S*o3!)Lr!$hPYY}YIuaS;=YL47q3%1L8&X0@8d_!( z<80z%16px{V;ym}%EFHSe8@C{)ueYmnSK=#-f|7#Gy*%?X(S$Pk1=eiw_rHXl2)3+ zK5w4*X)cRpl?9pqaSP-P>uQ}}f3nz~K{g*P5@+;e9Gq3sP}RfqDEQ!$=L-#uB2S2L z&(T>Mr7%RLscwy9E=FFynd4t?Tfmvhv9Vz)`4I=yhqEj|4mT~V>}!y#-XPyZh@6F1 znq^^P9T>wIyIF<#2LR>v%j?YFPH|hdgEBpLxlYHH6C1x_xypi7f5Wc_<*eK5T5pOpEx1>h zkDIT`vke~Ip zb`;|(CDd)J_3#E9g^Nb2 z`Aubw(2Nja+@7QND7;xIE#T3rlx})oTy`>Jn?3qq6`FX7UcG*Bkbw)eBhUvuk>XH4=>JF~ktpGU6d#2bl&{8NPxQB$+J6ZZPh9a=2 zNRY|z6%(!>!54CKW@5vR01d1+^_n^4pj?k2aJ4O%qm%1Owc#HgSG@YvY5KjcgA`8Pr`8 zr6}<8e>+9owgm^5AXse?e#-Cv*P%^k!R{&`7@JWLEMjg&&ET=Xs9t%hUC<)M;ou=N zJC7rE>q{K*psArmwn`}&tzD(Jyi{#r%S@m6WEN=_++ErW!znR_=(D<5P0!vQsYPo+SJV3I>X3H-Hn#{Ns#v z63H5*6d2CPa31INSw=|n^ln?C8#`U7$4)+}cRjF^goEr#c0|!<%N1tvKYysjCz@t+Ny9h{+i{Z*=b*=+1U8pYxHw`~cAZtyg@drS~8`7?(oyA53 z43EF^CSL%X5HAM^Z}&^5MM1NfSi$5oabQwnis$g0VglL0X-qdOX(HKx2IJfS;n?iE z3SczI4f&cR7;wFL=!~FGAj?0jakpUq2iziXW~a~Hxu-%5C;*itkO`=hc2h&yp$bqf zu*-<{&p)da4iUcdv0kJPI4zbkv8oeNS8R6DLW4SGowa~h8;A1nKEyc}4CiQ92=1#Vb0%m|#F0Pfna2^gfwdcRHnt1kn~E<25S#ITFT_4d34+}Z3&y*D~}^V%?gls{4eFlT_@T{U)bR-@L05X4W%O+W^Be0PIw2(NLX$ORILp8n=>g3Iv-h@Kz&!$UX zaM2d&j}x1@%_vbY-Xncbljy&>M!H%0vxF+?y;qYwlxuP!v#=s{XW6JcnW#1O^diZ5 zL3U^!*UG}wUY-g-S#=rm}HIN$i(8rT@oA0x~yPYo1$vSN% z(@x^S&v~357G_835V5aNBP9u+sG-at%2rf+7D5>)`Jgs2zzQJxNZ^d)tTUqE)qQAI z%j(zwVZn^y`8hAtW_W6H92rI}qouauXZNnyex;LB6 zie9oeb*Xxm6*8M?w_Z9*JW1NgAHnCKJGorArsNQDSwndW^lXx{k&5Wwe^7aeXV1K| z*COzRjRlRD##raPm^z~%7toQ%MxXmRtR2#m!B`WY12OSdSZ=hgTVKA5ZH?$kFgvY}X8Kzj@TS9O3w}U; zT@lR^z=AC6#=!ermKIrxRdwroN1ht{1-?4_E?m3a9pDuQdku&5to@sM(THKCU%bCR zz&iVG0oMFsAhYo9+73KMhfV`D%1(bJXn!ulY+Tc z&6OT>A6jJg-5Xw|15>OZ*59qqF?6IDzm8I=a0oI^B)gBZ9Q^)dJp~v>m}{^5K3VXF zrh2XnZcrji{{tkWULL!fxBPfV(NnwQaoVGIAK`=4dnOzKwqo|38^48=KWMf`uW0QXmF|G$&f#nE(D?9fRvA9~ z6e^%nOy<9Q)Xq2WBLimw#8n6ziOEN}l1#N_X%Fgq+Y)rT)>$LehT0*bx^yD*+fP5# ze}2Dk?qr>0{=rXn54=e9kQFaOd>N7DsG)4Wo2i35bxm{PCa0*5*8H#ysj%+240x?eH1k#ghn(BroyUJnIOn!hJI@ZlP% zRrR^8MW>ESu{HBf`2&fq*gfZl#hgcusp8)|5!i72St8bI3$*CHr9>j^?8p~zj0jpZ zVt`Pmc$VKGV(L3iPiD8CI)~u8hEhD?LV?jY&d4$eE#@x9_pNB;plm<3Rj5#ri%276 zuTjOnqKiObO1<3L7I+^hV8u?Q_xZ6RmBnk_2Yu2jj&Igx(94gsFHO$RpWXqcI6XN9 zc*QvQiRG%lSv^l{>m zlBWj3ea_!a7E_HjXv-I+$$!kxO9f(Y8&| zRb&Efxmn!avO|DoD3D*se5uBmI8yKEW1+?h)5 zPbDKwmn^{IVUTH^Bj zvj#hdePN3&F-P1(xl{?b^(nrY1)5riYPU-f|7(^~kapS4h4gSNrY<%#K@6E<-0H#ea7-f3ay}G#Wp3~U6xq!}bEO*KF z;!Hh~AU;cOSsl%rVgGOJWgCxY6I#Fp;W=%X+Vnwy2fdSU+`f1(MRs!TQBHt=eEze{7#guR1zQ%w3 zSbJMHNCUO9_8*&g66rTfxx1_S>7vDWgQV8(U)ut_Sm{MQ8N;|dPxr))%|tK2&q%&3 zEHXJdJoJ?QOT@WZ|34%c6N>kBS-dRsmSsRv;p*xd!p1YPWQ!MV;lm6D^ZEmpRs%?3 zk)%>W3S1kc2PmWSn%k~5*W$gI$Wj?9QR9$5Pb1b%ys*AyRTVI4aYQc{Y`E?PfK-KwkIU(l1Fxrr`G9Ym$Xu^``2@5Bt<3li5?k&pajBuO% zw}e|?59}sS`#zyr&$;6zERJyC616ny{ZoJ0+lgq3X+ijvE>x5TuwFw+ZIA=gAHmqz z>Df`c^&Ntr3nY-0gTO#)3--FLppYGfl`ik2?tb_KZvMl5+LNfzJH&62&;uRyH#Ja5d>+$LHFfsQ;W5rH6CAA~B~E?XAs_ z?@Evf6Xbl_mba886Wwb3`0TcaV@<-F!nn5a7wY~#{)9@AGDc;+Uepfv2mEsMfo#HdO=)t#} zfn6`rVq8Jth|&-TZ%qjnWY)`-n8S__3dgUt0z&30(b-}(BQ5y#%B=XECs>o=Q!pJ1 zw2o-c(Ie1k_psbv-%xne6lF|8=aN|pB0&qf^}SR|jDLt8#Fp!f>tOlFq2rn)mh8*6 z6Wo(||@_d)T!-&M+rDq<6#K}VCc3lC zDs4Ew7qDO4+FP z%MvdQV_nEMxZgG==!= z!THkM(L=qr{;4OX;8l*H@m;>~J2Ja7Zw#-!VqbfqWkariWMV&%x`aoOjsmT8Pw|ye z;UoI*Yw;aHW09jxP9&q-w-&zcA{U6K)t{kHRQCKHBtvkl%7jE0*Fk0_T2ee4IzFOP z!D>Tl!)x4Ns5a(=?x*EuPAArA$&bir^`W+FZdpB57#;tE;)gJ&UUG>M=WY{B049*` zgZQ}#?Wlfy4AN0BPp{Q03~U|;^S6`obai;!vYJM_Zp{>^r!fl#pC=6vPK*d%^fX&p zDzJa$M+>0MhO(Pt7KJEpTsg%uGkBN70DE&;EEz{lcRUlhO8b`+%JGyfSQ z5?WUK_xo3RpX^1USFHUX(8?dT-gtQBuJko$#Ga$`dH(up4dT^{JWkWDcpJUWfOVdI zN21|QVg_6$%!de|q&2Mnv7cX?qiGx>N=iBla(Ne+QM_yGH*wb1$mg{c*v&881o`Om z0qaNhFAn+EP9~?cn8~PQ0{S=y{qz3EKQsXczw*)$QH@)rMKCaUHkH_|k5f+m0Xy=A z3&Vrud1yL^^7l!NGOq@yE2i+F>QhK>W?kupEc=jrSD(S`x zPlamO75_bFk29tR=*+@t7hAW!rLw(8&BrfJpR#pZgB{m^x$#K^!haJAR#%mc)UZ(! zG97qr!|K-e!lQ*CWrY~&ZBOi(rLow$S0H2Stt4OSMUpQmFr*ne%Z^?^?O;usSMdUp zAbC|P@oI6t;d8B=V9*|SK4%5`CguUzn&Mps<= z2wT!r?_M2ltgcmx1Dxn&GK<-_$`M#uhwVIWLcu;pdQY#HN0o`Vg4-patT+YFIRCDe zRR;+{?pS$L=v^GcgT+j2{HKZc`a6QTL^uj8i`MNiYUkXev}TO&!VszmXNJof-M2;S zReORrJCiremr}`cRTmGgAZ7J=Cb zStAnLL@N@9W&>lqIv^Q0{7*;B$ss2*?ZRn2!Pw3!>Qwy;^~Kg(&IB^Exc1iZOuKAI z&jo6y*%$MB+7^R-ZvT9Qjs9xHc!+UhnU(95!FzecBf*{A;o(320pM*c&4CG4d%~;r zQJ7Nw7At*?K*Xl2%f{vC#4-FN^sS8u6Dxf}zomKdpctH+Z*$ud&ucF5V+yiu4o((4 zTyWQgwqwFuDdfxs+DtP^6CMh%@Ep?dkB6w8aSAb|KbfjrA?0|jJBb&3VMJAnAS`Kd z(7v)2#>*uBDSd;|f%`W>LZvm`q_6Bz^3*efu74XLPsDTCb9B7J_{>4+89t574eqik zb?RJKlrr;~*mp5tC3sGLlKU|I>fg)_TL Date: Sun, 25 Apr 2021 09:02:38 +0300 Subject: [PATCH 18/83] Added documentation about deleting downloaded files (related to #533) --- docs/file-download.adoc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/file-download.adoc b/docs/file-download.adoc index 677a2fe8..66ad2879 100644 --- a/docs/file-download.adoc +++ b/docs/file-download.adoc @@ -57,8 +57,15 @@ driver.navigate().to("http://example.com/myfile.odt"); . Files are accessible only when browser session is running. ==== -Your tests may need to download files with browsers. To analyze these files a common requirement is then to somehow extract downloaded files from browser containers. A possible solution can be dealing with container volumes. But Selenoid provides a `/download` API and dramatically simplifies downloading files. Having a running session `f2bcd32b-d932-4cdc-a639-687ab8e4f840` you can access all downloaded files using an URL: +Your tests may need to download files with browsers. To analyze these files a common requirement is then to somehow extract downloaded files from browser containers. A possible solution can be dealing with container volumes. But Selenoid provides a `/download` API and dramatically simplifies downloading files. Having a running session `f2bcd32b-d932-4cdc-a639-687ab8e4f840` you can access all downloaded files using an HTTP request: ``` -http://selenoid-host.example.com:4444/download/f2bcd32b-d932-4cdc-a639-687ab8e4f840/myfile.txt +GET http://selenoid-host.example.com:4444/download/f2bcd32b-d932-4cdc-a639-687ab8e4f840/myfile.txt ``` In order for this feature to work an HTTP file server should be listening inside browser container on port `8080`. Download directory inside container to be used in tests is usually `~/Downloads`. + +Similarly to delete downloaded files replace GET request with DELETE: + +[source] +---- +DELETE http://selenoid-host.example.com:4444/download/f2bcd32b-d932-4cdc-a639-687ab8e4f840/myfile.txt +---- From a4aeddfff3146ce7aa25227e707db7e1803924a3 Mon Sep 17 00:00:00 2001 From: Anatoliy Platonov <31926941+p4m-dev@users.noreply.github.com> Date: Sun, 2 May 2021 22:02:37 +0300 Subject: [PATCH 19/83] Fix broken command in documentation Fix for #1100 --- docs/starting-selenoid-manually.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/starting-selenoid-manually.adoc b/docs/starting-selenoid-manually.adoc index b16a9504..18724f49 100644 --- a/docs/starting-selenoid-manually.adoc +++ b/docs/starting-selenoid-manually.adoc @@ -107,7 +107,7 @@ docker run -d \ --name selenoid \ -p 4444:4444 \ -v /var/run/docker.sock:/var/run/docker.sock \ --v ./config/:/etc/selenoid/:ro \ +-v $(pwd)/config/:/etc/selenoid/:ro \ aerokube/selenoid:latest-release ---- From ba89d3de7461919dec98f1aad7b83f8f10c2f793 Mon Sep 17 00:00:00 2001 From: Anatoliy Platonov <31926941+p4m-dev@users.noreply.github.com> Date: Sun, 2 May 2021 22:15:34 +0300 Subject: [PATCH 20/83] Fix review notes --- docs/starting-selenoid-manually.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/starting-selenoid-manually.adoc b/docs/starting-selenoid-manually.adoc index 18724f49..3d3ba1f2 100644 --- a/docs/starting-selenoid-manually.adoc +++ b/docs/starting-selenoid-manually.adoc @@ -107,7 +107,7 @@ docker run -d \ --name selenoid \ -p 4444:4444 \ -v /var/run/docker.sock:/var/run/docker.sock \ --v $(pwd)/config/:/etc/selenoid/:ro \ +-v /your/directory/config/:/etc/selenoid/:ro \ aerokube/selenoid:latest-release ---- From ebba617e0297c8b5488d9ef2fa759a85924afe41 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Fri, 21 May 2021 17:53:50 +0300 Subject: [PATCH 21/83] Completely removed vnc: images from documentation --- docs/faq.adoc | 4 +--- docs/starting-selenoid-manually.adoc | 13 +++++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/faq.adoc b/docs/faq.adoc index ed69a696..a81eab9b 100644 --- a/docs/faq.adoc +++ b/docs/faq.adoc @@ -92,10 +92,8 @@ When running Selenoid as Docker container video feature can be not working (beca **Can't get VNC feature to work: Disconnected** -Please check the following: +Please check that you have `enableVNC = true` capability in your tests -. You have `enableVNC = true` capability in your tests -. You are using browser images with `vnc` in their name, e.g. `selenoid/vnc:firefox:58.0`. **Seeing black screen with a cross in VNC window** diff --git a/docs/starting-selenoid-manually.adoc b/docs/starting-selenoid-manually.adoc index 3d3ba1f2..1d3fe318 100644 --- a/docs/starting-selenoid-manually.adoc +++ b/docs/starting-selenoid-manually.adoc @@ -11,14 +11,14 @@ . Create `config/browsers.json` configuration file with content: + .config/browsers.json -[source,javascript] +[source,json] ---- { "firefox": { "default": "57.0", "versions": { "57.0": { - "image": "selenoid/vnc:firefox_57.0", + "image": "selenoid/firefox:88.0", "port": "4444", "path": "/wd/hub" } @@ -31,7 +31,7 @@ NOTE: For Chrome and Opera images "path" is "/" instead of "/wd/hub" + . Pull browser Docker image: + -`$ docker pull selenoid/vnc:firefox_57.0`. +`$ docker pull selenoid/firefox:88.0`. === Browser Images We maintain a set of prebuilt Docker container images for different browsers including: @@ -48,20 +48,21 @@ Feel free to create issues or request images for new versions. ==== . Complete list of browser images can be found in <> . These images support all UTF-8 locales. This can be important if you want to save files using national alphabet symbols. You can enable your preferred locale in browsers configuration file by setting respective environment variables: -``` +[source,json] +---- { "chrome": { "default": "64.0", "versions": { "64.0": { - "image": "selenoid/vnc:chrome_64.0", + "image": "selenoid/chrome:90.0", //... "env" : ["LANG=ru_RU.UTF-8", "LANGUAGE=ru:en", "LC_ALL=ru_RU.UTF-8"] } } } } -``` +---- ==== === Start Selenoid From 1939bbaabe7cd112ebc6d751af0440d101b8bb85 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Fri, 21 May 2021 17:54:44 +0300 Subject: [PATCH 22/83] Setting Host header to localhost (needed for recent Safari driver) --- selenoid.go | 1 + 1 file changed, 1 insertion(+) diff --git a/selenoid.go b/selenoid.go index 49987313..5016bb53 100644 --- a/selenoid.go +++ b/selenoid.go @@ -506,6 +506,7 @@ func proxy(w http.ResponseWriter, r *http.Request) { } } r.URL.Host, r.URL.Path = sess.URL.Host, path.Clean(sess.URL.Path+r.URL.Path) + r.Host = "localhost" return } r.URL.Path = paths.Error From 027b183015871bb3a9bc3220235b9d0c2d6a7a67 Mon Sep 17 00:00:00 2001 From: Pavel Smalenski Date: Wed, 23 Jun 2021 12:38:39 +0200 Subject: [PATCH 23/83] Prevent unwanted timeout function call --- selenoid.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/selenoid.go b/selenoid.go index 5016bb53..bff21939 100644 --- a/selenoid.go +++ b/selenoid.go @@ -529,6 +529,11 @@ func reverseProxy(hostFn func(sess *session.Session) string, status string) func sid, remainingPath := splitRequestPath(r.URL.Path) sess, ok := sessions.Get(sid) if ok { + select { + case <-sess.TimeoutCh: + default: + close(sess.TimeoutCh) + } sess.TimeoutCh = onTimeout(sess.Timeout, func() { request{r}.session(sid).Delete(requestId) }) From b97e406c5c56983901cb0486c799f9f4e207e1b3 Mon Sep 17 00:00:00 2001 From: Georgij Boljuba Date: Thu, 22 Jul 2021 12:36:32 +0200 Subject: [PATCH 24/83] Propagate Content-Type header if client sends it --- selenoid.go | 4 ++++ selenoid_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/selenoid.go b/selenoid.go index 5016bb53..5a1ba33d 100644 --- a/selenoid.go +++ b/selenoid.go @@ -206,6 +206,10 @@ func create(w http.ResponseWriter, r *http.Request) { r.URL.Host, r.URL.Path = u.Host, path.Join(u.Path, r.URL.Path) newBody := removeSelenoidOptions(body) req, _ := http.NewRequest(http.MethodPost, r.URL.String(), bytes.NewReader(newBody)) + contentType := r.Header.Get("Content-Type") + if len(contentType) > 0 { + req.Header.Set("Content-Type", contentType) + } ctx, done := context.WithTimeout(r.Context(), newSessionAttemptTimeout) defer done() log.Printf("[%d] [SESSION_ATTEMPTED] [%s] [%d]", requestId, u.String(), i) diff --git a/selenoid_test.go b/selenoid_test.go index 057c2202..c9172dfa 100644 --- a/selenoid_test.go +++ b/selenoid_test.go @@ -304,6 +304,30 @@ func TestSessionCreatedWdHub(t *testing.T) { queue.Release() } +func TestSessionWithContentTypeCreatedWdHub(t *testing.T) { + root := http.NewServeMux() + root.Handle("/wd/hub/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = strings.TrimPrefix(r.URL.Path, "/wd/hub") + AssertThat(t, r.Header.Get("Content-Type"), Is{"application/json; charset=utf-8"}) + Selenium().ServeHTTP(w, r) + })) + manager = &HTTPTest{Handler: root} + + resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "application/json; charset=utf-8", bytes.NewReader([]byte("{}"))) + AssertThat(t, err, Is{nil}) + var sess map[string]string + AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + + resp, err = http.Get(With(srv.URL).Path("/status")) + AssertThat(t, err, Is{nil}) + var state config.State + AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) + AssertThat(t, state.Used, EqualTo{1}) + AssertThat(t, queue.Used(), EqualTo{1}) + sessions.Remove(sess["sessionId"]) + queue.Release() +} + func TestSessionFailedAfterTimeout(t *testing.T) { newSessionAttemptTimeout = 10 * time.Millisecond manager = &HTTPTest{Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { From 3223dccfc81b891fe99905f95a2fb6d0146b6932 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Thu, 29 Jul 2021 16:55:50 +0300 Subject: [PATCH 25/83] Setting Host header to localhost when creating session too (related to #1124) --- selenoid.go | 1 + 1 file changed, 1 insertion(+) diff --git a/selenoid.go b/selenoid.go index 5a1ba33d..eaf85c37 100644 --- a/selenoid.go +++ b/selenoid.go @@ -210,6 +210,7 @@ func create(w http.ResponseWriter, r *http.Request) { if len(contentType) > 0 { req.Header.Set("Content-Type", contentType) } + req.Host = "localhost" ctx, done := context.WithTimeout(r.Context(), newSessionAttemptTimeout) defer done() log.Printf("[%d] [SESSION_ATTEMPTED] [%s] [%d]", requestId, u.String(), i) From 80c19797f774463bc033b616738e520685bb65be Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Tue, 31 Aug 2021 16:23:40 +0300 Subject: [PATCH 26/83] Added note about sudo to quick-start-guide --- docs/quick-start-guide.adoc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/quick-start-guide.adoc b/docs/quick-start-guide.adoc index 1001d361..b6cfff50 100644 --- a/docs/quick-start-guide.adoc +++ b/docs/quick-start-guide.adoc @@ -12,6 +12,16 @@ . Run one command to start Selenoid: $ ./cm selenoid start --vnc ++ +[WARNING] +==== +Running this command with `sudo` can lead to broken installation. Recommended way is running Selenoid as regular user. On Linux to have permissions to access Docker you may need to add your user to `docker` group: +[source,bash] +---- +$ sudo usermod -aG docker $USER +---- +==== ++ . Optionally run one more command to start Selenoid UI: From 6131e8a5cf488f265b29209e6ca66f2de5f9f92b Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 6 Sep 2021 13:44:39 +0300 Subject: [PATCH 27/83] Bump Golang to 1.17.0 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- go.mod | 14 +++++++++++++- go.sum | 3 --- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2e48fdd5..8f9d9a69 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.16.x + go-version: 1.17.x - uses: actions/cache@v1 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 218974d8..40d0fd29 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.16.x + go-version: 1.17.x - uses: actions/cache@v1 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f5455121..a5572b6b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.16.x + go-version: 1.17.x - uses: actions/cache@v1 with: diff --git a/go.mod b/go.mod index db4e24cc..d32140f3 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,32 @@ module github.com/aerokube/selenoid -go 1.16 +go 1.17 require ( + github.com/Microsoft/go-winio v0.4.12 // indirect github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e github.com/aerokube/ggr v0.0.0-20181215175518-4a2e23fa1769 github.com/aerokube/util v0.0.0-20190701120823-161c21b50f69 github.com/aws/aws-sdk-go v1.20.12 + github.com/docker/distribution v2.7.1+incompatible // indirect github.com/docker/docker v0.7.3-0.20190629173937-e105a74c5419 github.com/docker/go-connections v0.4.0 github.com/docker/go-units v0.4.0 + github.com/gogo/protobuf v1.2.1 // indirect + github.com/golang/protobuf v1.2.0 // indirect github.com/gorilla/websocket v1.4.2 github.com/imdario/mergo v0.3.6 + github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.1 // indirect github.com/mafredri/cdp v0.21.0 + github.com/opencontainers/go-digest v1.0.0-rc1 // indirect + github.com/opencontainers/image-spec v1.0.1 // indirect github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c github.com/pkg/errors v0.8.1 + github.com/sirupsen/logrus v1.4.2 // indirect golang.org/x/net v0.0.0-20190311183353-d8887717615a + golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect + google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 // indirect + google.golang.org/grpc v1.21.1 // indirect gopkg.in/yaml.v2 v2.2.2 // indirect ) diff --git a/go.sum b/go.sum index 2f69d907..63111c75 100644 --- a/go.sum +++ b/go.sum @@ -29,12 +29,10 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -94,7 +92,6 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/grpc v1.21.1 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From d6fc603e4c50338d929f4a8bd285cee514d91fb7 Mon Sep 17 00:00:00 2001 From: Alexander Andryashin Date: Fri, 5 Nov 2021 20:43:22 +0300 Subject: [PATCH 28/83] Fixed file upload. --- selenoid.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/selenoid.go b/selenoid.go index e625ac7b..bb23ace1 100644 --- a/selenoid.go +++ b/selenoid.go @@ -510,6 +510,10 @@ func proxy(w http.ResponseWriter, r *http.Request) { return } } + seUploadPath, uploadPath := "/se/file", "/file" + if strings.HasSuffix(r.URL.Path, seUploadPath) { + r.URL.Path = strings.TrimSuffix(r.URL.Path, seUploadPath)+uploadPath + } r.URL.Host, r.URL.Path = sess.URL.Host, path.Clean(sess.URL.Path+r.URL.Path) r.Host = "localhost" return From dd5f2574c9cddbfae65dca65ba743bb2d0fb607d Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 15 Nov 2021 07:27:03 +0300 Subject: [PATCH 29/83] Automatically building binary for arm64 arch --- ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index 922a2295..a23f3c33 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -3,4 +3,4 @@ export GO111MODULE="on" go get -u github.com/mitchellh/gox # cross compile GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -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" -gox -os "linux darwin windows" -arch "amd64" -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" +gox -os "linux darwin windows" -arch "amd64" -osarch="darwin/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" From 04669910cff3a33ddc41edba9ddd1fc004c6e147 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Fri, 19 Nov 2021 14:55:21 +0300 Subject: [PATCH 30/83] Switched to w3c standard compatible errors (fixes #1143) --- jsonerror/jsonerror.go | 52 ++++++++++++++++++++++++++++++++++++++++++ main.go | 4 +++- protect/queue.go | 8 +++++-- selenoid.go | 43 ++++++++++++++++++---------------- 4 files changed, 84 insertions(+), 23 deletions(-) create mode 100644 jsonerror/jsonerror.go diff --git a/jsonerror/jsonerror.go b/jsonerror/jsonerror.go new file mode 100644 index 00000000..db04aad5 --- /dev/null +++ b/jsonerror/jsonerror.go @@ -0,0 +1,52 @@ +package jsonerror + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type SeleniumError struct { + Name string + Err error + Status int +} + +func (se *SeleniumError) Error() string { + return fmt.Errorf("%s: %v", se.Name, se.Err).Error() +} + +func newSeleniumError(name string, err error, status int) *SeleniumError { + return &SeleniumError{ + Name: name, + Err: err, + Status: status, + } +} + +func InvalidArgument(err error) *SeleniumError { + return newSeleniumError("invalid argument", err, http.StatusBadRequest) +} + +func InvalidSessionID(err error) *SeleniumError { + return newSeleniumError("invalid session id", err, http.StatusNotFound) +} + +func SessionNotCreated(err error) *SeleniumError { + return newSeleniumError("session not created", err, http.StatusInternalServerError) +} + +func UnknownError(err error) *SeleniumError { + return newSeleniumError("unknown error", err, http.StatusInternalServerError) +} + +func (se *SeleniumError) Encode(w http.ResponseWriter) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(se.Status) + _ = json.NewEncoder(w).Encode(map[string]interface{}{ + "value": map[string]string{ + "error": se.Name, + "message": se.Err.Error(), + }, + }) +} diff --git a/main.go b/main.go index 846cab3f..531e6df8 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,8 @@ import ( "context" "encoding/json" "flag" + "github.com/aerokube/selenoid/jsonerror" + "github.com/pkg/errors" "log" "net" "net/http" @@ -329,7 +331,7 @@ func handler() http.Handler { selenium().ServeHTTP(w, r) }) root.HandleFunc(paths.Error, func(w http.ResponseWriter, r *http.Request) { - util.JsonError(w, "Session timed out or not found", http.StatusNotFound) + jsonerror.InvalidSessionID(errors.New("session timed out or not found")).Encode(w) }) root.HandleFunc(paths.Status, func(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "application/json") diff --git a/protect/queue.go b/protect/queue.go index 6f16bf8a..abbddaf9 100644 --- a/protect/queue.go +++ b/protect/queue.go @@ -1,6 +1,8 @@ package protect import ( + "errors" + "github.com/aerokube/selenoid/jsonerror" "log" "math" "net/http" @@ -28,7 +30,8 @@ func (q *Queue) Try(next http.HandlerFunc) http.HandlerFunc { <-q.limit default: if noWait { - util.JsonError(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests) + err := errors.New(http.StatusText(http.StatusTooManyRequests)) + jsonerror.UnknownError(err).Encode(w) return } } @@ -46,7 +49,8 @@ func (q *Queue) Check(next http.HandlerFunc) http.HandlerFunc { if q.disabled { user, remote := util.RequestInfo(r) log.Printf("[-] [QUEUE_IS_FULL] [%s] [%s]", user, remote) - util.JsonError(w, "Queue Is Full", http.StatusTooManyRequests) + err := errors.New("Queue Is Full") + jsonerror.UnknownError(err).Encode(w) return } } diff --git a/selenoid.go b/selenoid.go index bb23ace1..835584ae 100644 --- a/selenoid.go +++ b/selenoid.go @@ -7,8 +7,10 @@ import ( "crypto/rand" "encoding/hex" "encoding/json" + "errors" "fmt" "github.com/aerokube/selenoid/event" + "github.com/aerokube/selenoid/jsonerror" "github.com/aerokube/selenoid/service" "github.com/imdario/mergo" "io" @@ -114,7 +116,7 @@ func create(w http.ResponseWriter, r *http.Request) { r.Body.Close() if err != nil { log.Printf("[%d] [ERROR_READING_REQUEST] [%v]", requestId, err) - util.JsonError(w, err.Error(), http.StatusBadRequest) + jsonerror.InvalidArgument(err).Encode(w) queue.Drop() return } @@ -128,7 +130,7 @@ func create(w http.ResponseWriter, r *http.Request) { err = json.Unmarshal(body, &browser) if err != nil { log.Printf("[%d] [BAD_JSON_FORMAT] [%v]", requestId, err) - util.JsonError(w, err.Error(), http.StatusBadRequest) + jsonerror.InvalidArgument(err).Encode(w) queue.Drop() return } @@ -151,14 +153,14 @@ func create(w http.ResponseWriter, r *http.Request) { sessionTimeout, err = getSessionTimeout(caps.SessionTimeout, maxTimeout, timeout) if err != nil { log.Printf("[%d] [BAD_SESSION_TIMEOUT] [%s]", requestId, caps.SessionTimeout) - util.JsonError(w, err.Error(), http.StatusBadRequest) + jsonerror.InvalidArgument(err).Encode(w) queue.Drop() return } resolution, err := getScreenResolution(caps.ScreenResolution) if err != nil { log.Printf("[%d] [BAD_SCREEN_RESOLUTION] [%s]", requestId, caps.ScreenResolution) - util.JsonError(w, err.Error(), http.StatusBadRequest) + jsonerror.InvalidArgument(err).Encode(w) queue.Drop() return } @@ -166,7 +168,7 @@ func create(w http.ResponseWriter, r *http.Request) { videoScreenSize, err := getVideoScreenSize(caps.VideoScreenSize, resolution) if err != nil { log.Printf("[%d] [BAD_VIDEO_SCREEN_SIZE] [%s]", requestId, caps.VideoScreenSize) - util.JsonError(w, err.Error(), http.StatusBadRequest) + jsonerror.InvalidArgument(err).Encode(w) queue.Drop() return } @@ -186,14 +188,14 @@ func create(w http.ResponseWriter, r *http.Request) { } if !ok { log.Printf("[%d] [ENVIRONMENT_NOT_AVAILABLE] [%s] [%s]", requestId, caps.BrowserName(), caps.Version) - util.JsonError(w, "Requested environment is not available", http.StatusBadRequest) + jsonerror.InvalidArgument(errors.New("Requested environment is not available")).Encode(w) queue.Drop() return } startedService, err := starter.StartWithCancel() if err != nil { log.Printf("[%d] [SERVICE_STARTUP_FAILED] [%v]", requestId, err) - util.JsonError(w, err.Error(), http.StatusInternalServerError) + jsonerror.SessionNotCreated(err).Encode(w) queue.Drop() return } @@ -228,7 +230,7 @@ func create(w http.ResponseWriter, r *http.Request) { } err := fmt.Errorf("New session attempts retry count exceeded") log.Printf("[%d] [SESSION_FAILED] [%s] [%s]", requestId, u.String(), err) - util.JsonError(w, err.Error(), http.StatusInternalServerError) + jsonerror.UnknownError(err).Encode(w) case context.Canceled: log.Printf("[%d] [CLIENT_DISCONNECTED] [%s] [%s] [%.2fs]", requestId, user, remote, util.SecondsSince(sessionStartTime)) } @@ -242,7 +244,7 @@ func create(w http.ResponseWriter, r *http.Request) { rsp.Body.Close() } log.Printf("[%d] [SESSION_FAILED] [%s] [%s]", requestId, u.String(), err) - util.JsonError(w, err.Error(), http.StatusInternalServerError) + jsonerror.SessionNotCreated(err).Encode(w) queue.Drop() cancel() return @@ -415,7 +417,7 @@ func getScreenResolution(input string) (string, error) { return fmt.Sprintf("%sx24", input), nil } return "", fmt.Errorf( - "Malformed screenResolution capability: %s. Correct format is WxH (1920x1080) or WxHxD (1920x1080x24).", + "malformed screenResolution capability: %s, correct format is WxH (1920x1080) or WxHxD (1920x1080x24)", input, ) } @@ -430,7 +432,7 @@ func getVideoScreenSize(videoScreenSize string, screenResolution string) (string return videoScreenSize, nil } return "", fmt.Errorf( - "Malformed videoScreenSize capability: %s. Correct format is WxH (1920x1080).", + "malformed videoScreenSize capability: %s, correct format is WxH (1920x1080)", videoScreenSize, ) } @@ -512,7 +514,7 @@ func proxy(w http.ResponseWriter, r *http.Request) { } seUploadPath, uploadPath := "/se/file", "/file" if strings.HasSuffix(r.URL.Path, seUploadPath) { - r.URL.Path = strings.TrimSuffix(r.URL.Path, seUploadPath)+uploadPath + r.URL.Path = strings.TrimSuffix(r.URL.Path, seUploadPath) + uploadPath } r.URL.Host, r.URL.Path = sess.URL.Host, path.Clean(sess.URL.Path+r.URL.Path) r.Host = "localhost" @@ -556,7 +558,7 @@ func reverseProxy(hostFn func(sess *session.Session) string, status string) func ErrorHandler: defaultErrorHandler(requestId), }).ServeHTTP(w, r) } else { - util.JsonError(w, fmt.Sprintf("Unknown session %s", sid), http.StatusNotFound) + jsonerror.InvalidSessionID(fmt.Errorf("unknown session %s", sid)).Encode(w) log.Printf("[%d] [SESSION_NOT_FOUND] [%s]", requestId, sid) } } @@ -573,41 +575,42 @@ func fileUpload(w http.ResponseWriter, r *http.Request) { } err := json.NewDecoder(r.Body).Decode(&jsonRequest) if err != nil { - util.JsonError(w, err.Error(), http.StatusBadRequest) + jsonerror.InvalidArgument(err).Encode(w) return } z, err := zip.NewReader(bytes.NewReader(jsonRequest.File), int64(len(jsonRequest.File))) if err != nil { - util.JsonError(w, err.Error(), http.StatusBadRequest) + jsonerror.InvalidArgument(err).Encode(w) return } if len(z.File) != 1 { - util.JsonError(w, fmt.Sprintf("Expected there to be only 1 file. There were: %d", len(z.File)), http.StatusBadRequest) + err := fmt.Errorf("expected there to be only 1 file. There were: %d", len(z.File)) + jsonerror.InvalidArgument(err).Encode(w) return } file := z.File[0] src, err := file.Open() if err != nil { - util.JsonError(w, err.Error(), http.StatusBadRequest) + jsonerror.InvalidArgument(err).Encode(w) return } defer src.Close() dir := r.Header.Get("X-Selenoid-File") err = os.MkdirAll(dir, 0755) if err != nil { - util.JsonError(w, err.Error(), http.StatusInternalServerError) + jsonerror.UnknownError(err).Encode(w) return } fileName := filepath.Join(dir, file.Name) dst, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE, 0644) if err != nil { - util.JsonError(w, err.Error(), http.StatusInternalServerError) + jsonerror.UnknownError(err).Encode(w) return } defer dst.Close() _, err = io.Copy(dst, src) if err != nil { - util.JsonError(w, err.Error(), http.StatusInternalServerError) + jsonerror.UnknownError(err).Encode(w) return } From ef07133a5ee82724c6b757f182e04bd6a3040ca9 Mon Sep 17 00:00:00 2001 From: Eng Zer Jun Date: Sat, 20 Nov 2021 14:02:44 +0800 Subject: [PATCH 31/83] Run `go fmt ./...` and `go mod tidy -go=1.17` Signed-off-by: Eng Zer Jun --- config/config.go | 5 ++--- go.mod | 19 +++++++++++-------- main.go | 13 +++++-------- metadata.go | 6 ++++-- protect/queue.go | 2 +- s3_test.go | 10 ++++++---- selenoid.go | 8 ++++---- selenoid_test.go | 12 +++++------- service/docker.go | 8 ++++---- service/driver.go | 16 ++++++++-------- service/driver_unix.go | 7 ++++--- service/driver_windows.go | 1 + service_test.go | 17 +++++++++-------- session/session.go | 3 ++- upload/s3.go | 14 ++++++++------ upload/uploader.go | 5 +++-- utils_test.go | 8 +++----- 17 files changed, 80 insertions(+), 74 deletions(-) diff --git a/config/config.go b/config/config.go index 9e555cdf..23647cb1 100644 --- a/config/config.go +++ b/config/config.go @@ -1,17 +1,16 @@ package config import ( - "log" - "encoding/json" "fmt" "io/ioutil" + "log" "strings" "sync" + "time" "github.com/aerokube/selenoid/session" "github.com/docker/docker/api/types/container" - "time" ) // Session - session id and vnc flag diff --git a/go.mod b/go.mod index d32140f3..4656a159 100644 --- a/go.mod +++ b/go.mod @@ -3,28 +3,31 @@ module github.com/aerokube/selenoid go 1.17 require ( - github.com/Microsoft/go-winio v0.4.12 // indirect github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e github.com/aerokube/ggr v0.0.0-20181215175518-4a2e23fa1769 github.com/aerokube/util v0.0.0-20190701120823-161c21b50f69 github.com/aws/aws-sdk-go v1.20.12 - github.com/docker/distribution v2.7.1+incompatible // indirect github.com/docker/docker v0.7.3-0.20190629173937-e105a74c5419 github.com/docker/go-connections v0.4.0 github.com/docker/go-units v0.4.0 - github.com/gogo/protobuf v1.2.1 // indirect - github.com/golang/protobuf v1.2.0 // indirect github.com/gorilla/websocket v1.4.2 github.com/imdario/mergo v0.3.6 + github.com/mafredri/cdp v0.21.0 + github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c + github.com/pkg/errors v0.8.1 + golang.org/x/net v0.0.0-20190311183353-d8887717615a +) + +require ( + github.com/Microsoft/go-winio v0.4.12 // indirect + github.com/docker/distribution v2.7.1+incompatible // indirect + github.com/gogo/protobuf v1.2.1 // indirect + github.com/golang/protobuf v1.2.0 // indirect github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.1 // indirect - github.com/mafredri/cdp v0.21.0 github.com/opencontainers/go-digest v1.0.0-rc1 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect - github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c - github.com/pkg/errors v0.8.1 github.com/sirupsen/logrus v1.4.2 // indirect - golang.org/x/net v0.0.0-20190311183353-d8887717615a golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 // indirect google.golang.org/grpc v1.21.1 // indirect diff --git a/main.go b/main.go index 531e6df8..9759211b 100644 --- a/main.go +++ b/main.go @@ -4,27 +4,22 @@ import ( "context" "encoding/json" "flag" - "github.com/aerokube/selenoid/jsonerror" - "github.com/pkg/errors" + "fmt" "log" "net" "net/http" "os" "os/signal" "path" + "path/filepath" "strconv" "strings" "syscall" "time" - "golang.org/x/net/websocket" - - "fmt" - - "path/filepath" - ggr "github.com/aerokube/ggr/config" "github.com/aerokube/selenoid/config" + "github.com/aerokube/selenoid/jsonerror" "github.com/aerokube/selenoid/protect" "github.com/aerokube/selenoid/service" "github.com/aerokube/selenoid/session" @@ -32,6 +27,8 @@ import ( "github.com/aerokube/util" "github.com/aerokube/util/docker" "github.com/docker/docker/client" + "github.com/pkg/errors" + "golang.org/x/net/websocket" ) var ( diff --git a/metadata.go b/metadata.go index 2481a3e6..8d226e34 100644 --- a/metadata.go +++ b/metadata.go @@ -1,15 +1,17 @@ +//go:build metadata // +build metadata package main import ( "encoding/json" - "github.com/aerokube/selenoid/event" - "github.com/aerokube/selenoid/session" "io/ioutil" "log" "path/filepath" "time" + + "github.com/aerokube/selenoid/event" + "github.com/aerokube/selenoid/session" ) const metadataFileExtension = ".json" diff --git a/protect/queue.go b/protect/queue.go index abbddaf9..d6c3f28c 100644 --- a/protect/queue.go +++ b/protect/queue.go @@ -2,12 +2,12 @@ package protect import ( "errors" - "github.com/aerokube/selenoid/jsonerror" "log" "math" "net/http" "time" + "github.com/aerokube/selenoid/jsonerror" "github.com/aerokube/util" ) diff --git a/s3_test.go b/s3_test.go index c6e62a54..b8e14866 100644 --- a/s3_test.go +++ b/s3_test.go @@ -1,13 +1,10 @@ +//go:build s3 // +build s3 package main import ( "context" - . "github.com/aandryashin/matchers" - "github.com/aerokube/selenoid/event" - "github.com/aerokube/selenoid/session" - "github.com/aerokube/selenoid/upload" "io/ioutil" "net" "net/http" @@ -15,6 +12,11 @@ import ( "strings" "testing" "time" + + . "github.com/aandryashin/matchers" + "github.com/aerokube/selenoid/event" + "github.com/aerokube/selenoid/session" + "github.com/aerokube/selenoid/upload" ) var ( diff --git a/selenoid.go b/selenoid.go index 835584ae..12713670 100644 --- a/selenoid.go +++ b/selenoid.go @@ -9,10 +9,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/aerokube/selenoid/event" - "github.com/aerokube/selenoid/jsonerror" - "github.com/aerokube/selenoid/service" - "github.com/imdario/mergo" "io" "io/ioutil" "log" @@ -28,10 +24,14 @@ import ( "sync" "time" + "github.com/aerokube/selenoid/event" + "github.com/aerokube/selenoid/jsonerror" + "github.com/aerokube/selenoid/service" "github.com/aerokube/selenoid/session" "github.com/aerokube/util" "github.com/docker/docker/api/types" "github.com/docker/docker/pkg/stdcopy" + "github.com/imdario/mergo" "golang.org/x/net/websocket" ) diff --git a/selenoid_test.go b/selenoid_test.go index c9172dfa..9983d8d2 100644 --- a/selenoid_test.go +++ b/selenoid_test.go @@ -3,26 +3,24 @@ package main import ( "bytes" "context" + "encoding/json" "fmt" - "github.com/mafredri/cdp" - "github.com/mafredri/cdp/rpcc" "io/ioutil" "log" "net/http" "net/http/httptest" "os" + "path/filepath" "strings" "testing" "time" - "github.com/aerokube/selenoid/config" - - "encoding/json" - "path/filepath" - . "github.com/aandryashin/matchers" . "github.com/aandryashin/matchers/httpresp" ggr "github.com/aerokube/ggr/config" + "github.com/aerokube/selenoid/config" + "github.com/mafredri/cdp" + "github.com/mafredri/cdp/rpcc" ) var _ = func() bool { diff --git a/service/docker.go b/service/docker.go index a102f9cf..447309bc 100644 --- a/service/docker.go +++ b/service/docker.go @@ -3,11 +3,13 @@ package service import ( "context" "fmt" - "github.com/docker/go-units" "log" "net" "net/url" + "os" + "path/filepath" "strconv" + "strings" "time" "github.com/aerokube/selenoid/config" @@ -20,9 +22,7 @@ import ( "github.com/docker/docker/client" "github.com/docker/docker/pkg/stdcopy" "github.com/docker/go-connections/nat" - "os" - "path/filepath" - "strings" + "github.com/docker/go-units" ) const ( diff --git a/service/driver.go b/service/driver.go index 342b2de6..587d37cd 100644 --- a/service/driver.go +++ b/service/driver.go @@ -1,18 +1,18 @@ package service import ( + "errors" "fmt" "log" "net" "net/url" + "os" "os/exec" + "path/filepath" "time" - "errors" "github.com/aerokube/selenoid/session" "github.com/aerokube/util" - "os" - "path/filepath" ) // Driver - driver processes manager @@ -77,11 +77,11 @@ func (d *Driver) StartWithCancel() (*StartedService, error) { } log.Printf("[%d] [PROCESS_STARTED] [%d] [%.2fs]", requestId, cmd.Process.Pid, util.SecondsSince(s)) log.Printf("[%d] [PROXY_TO] [%s]", requestId, u.String()) - hp := session.HostPort{} - if d.Caps.VNC { - hp.VNC = "127.0.0.1:5900" - } - return &StartedService{Url: u, HostPort: hp, Cancel: func() { d.stopProcess(cmd) }}, nil + hp := session.HostPort{} + if d.Caps.VNC { + hp.VNC = "127.0.0.1:5900" + } + return &StartedService{Url: u, HostPort: hp, Cancel: func() { d.stopProcess(cmd) }}, nil } func (d *Driver) stopProcess(cmd *exec.Cmd) { diff --git a/service/driver_unix.go b/service/driver_unix.go index e0ff87f2..8f95e3d0 100644 --- a/service/driver_unix.go +++ b/service/driver_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package service @@ -8,7 +9,7 @@ import ( ) func stopProc(cmd *exec.Cmd) error { - exitCode := cmd.Process.Signal(syscall.SIGINT) - cmd.Wait() - return exitCode + exitCode := cmd.Process.Signal(syscall.SIGINT) + cmd.Wait() + return exitCode } diff --git a/service/driver_windows.go b/service/driver_windows.go index cff64adb..782bb1ab 100644 --- a/service/driver_windows.go +++ b/service/driver_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package service diff --git a/service_test.go b/service_test.go index 9d34cd68..40d3d51c 100644 --- a/service_test.go +++ b/service_test.go @@ -3,14 +3,6 @@ package main import ( "bytes" "fmt" - . "github.com/aandryashin/matchers" - "github.com/aerokube/selenoid/config" - "github.com/aerokube/selenoid/service" - "github.com/aerokube/selenoid/session" - "github.com/aerokube/util" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/client" - "golang.org/x/net/websocket" "io" "io/ioutil" "net" @@ -21,6 +13,15 @@ import ( "sync" "testing" "time" + + . "github.com/aandryashin/matchers" + "github.com/aerokube/selenoid/config" + "github.com/aerokube/selenoid/service" + "github.com/aerokube/selenoid/session" + "github.com/aerokube/util" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/client" + "golang.org/x/net/websocket" ) var ( diff --git a/session/session.go b/session/session.go index 3aa53936..3327d77e 100644 --- a/session/session.go +++ b/session/session.go @@ -1,10 +1,11 @@ package session import ( - "github.com/imdario/mergo" "net/url" "sync" "time" + + "github.com/imdario/mergo" ) // Caps - user capabilities diff --git a/upload/s3.go b/upload/s3.go index 01ed6dd8..b54dfbf1 100644 --- a/upload/s3.go +++ b/upload/s3.go @@ -1,3 +1,4 @@ +//go:build s3 // +build s3 package upload @@ -5,18 +6,19 @@ package upload import ( "flag" "fmt" - "github.com/aerokube/selenoid/event" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - awssession "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3/s3manager" - "github.com/pkg/errors" "log" "mime" "os" "path/filepath" "strings" "time" + + "github.com/aerokube/selenoid/event" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + awssession "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/s3/s3manager" + "github.com/pkg/errors" ) func init() { diff --git a/upload/uploader.go b/upload/uploader.go index 7ce3d949..3bbb70b1 100644 --- a/upload/uploader.go +++ b/upload/uploader.go @@ -1,10 +1,11 @@ package upload import ( - "github.com/aerokube/selenoid/event" - "github.com/aerokube/util" "log" "time" + + "github.com/aerokube/selenoid/event" + "github.com/aerokube/util" ) var ( diff --git a/utils_test.go b/utils_test.go index d40a0457..160afdd6 100644 --- a/utils_test.go +++ b/utils_test.go @@ -5,8 +5,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/aerokube/selenoid/protect" - "github.com/gorilla/websocket" "log" "net/http" "net/http/httptest" @@ -14,14 +12,14 @@ import ( "strconv" "strings" "sync" - - "time" - "testing" + "time" . "github.com/aandryashin/matchers" + "github.com/aerokube/selenoid/protect" "github.com/aerokube/selenoid/service" "github.com/aerokube/selenoid/session" + "github.com/gorilla/websocket" "github.com/pborman/uuid" ) From 417f0d15eac780e37687b88589b3c78f35ab1819 Mon Sep 17 00:00:00 2001 From: Eng Zer Jun Date: Sat, 20 Nov 2021 14:15:18 +0800 Subject: [PATCH 32/83] Move from io/ioutil to io and os packages The io/ioutil package has been deprecated as of Go 1.16, see https://golang.org/doc/go1.16#ioutil. This commit replaces the existing io/ioutil functions with their new definitions in io and os packages. Signed-off-by: Eng Zer Jun --- config/config.go | 4 ++-- config_test.go | 3 +-- metadata.go | 4 ++-- s3_test.go | 4 ++-- selenoid.go | 5 ++--- selenoid_test.go | 20 ++++++++++---------- service_test.go | 3 +-- 7 files changed, 20 insertions(+), 23 deletions(-) diff --git a/config/config.go b/config/config.go index 23647cb1..92dd8bda 100644 --- a/config/config.go +++ b/config/config.go @@ -3,8 +3,8 @@ package config import ( "encoding/json" "fmt" - "io/ioutil" "log" + "os" "strings" "sync" "time" @@ -85,7 +85,7 @@ func NewConfig() *Config { } func loadJSON(filename string, v interface{}) error { - buf, err := ioutil.ReadFile(filename) + buf, err := os.ReadFile(filename) if err != nil { return fmt.Errorf("read error: %v", err) } diff --git a/config_test.go b/config_test.go index f848afb0..fbd200dc 100644 --- a/config_test.go +++ b/config_test.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "io/ioutil" "log" "os" "testing" @@ -15,7 +14,7 @@ import ( const testLogConf = "config/container-logs.json" func configfile(s string) string { - tmp, err := ioutil.TempFile("", "config") + tmp, err := os.CreateTemp("", "config") if err != nil { log.Fatal(err) } diff --git a/metadata.go b/metadata.go index 8d226e34..b8ed2768 100644 --- a/metadata.go +++ b/metadata.go @@ -5,8 +5,8 @@ package main import ( "encoding/json" - "io/ioutil" "log" + "os" "path/filepath" "time" @@ -39,7 +39,7 @@ func (mp *MetadataProcessor) OnSessionStopped(stoppedSession event.StoppedSessio return } filename := filepath.Join(logOutputDir, stoppedSession.SessionId+metadataFileExtension) - err = ioutil.WriteFile(filename, data, 0644) + err = os.WriteFile(filename, data, 0644) if err != nil { log.Printf("[%d] [METADATA] [%s] [Failed to save to %s: %v]", stoppedSession.RequestId, stoppedSession.SessionId, filename, err) return diff --git a/s3_test.go b/s3_test.go index b8e14866..7ba0fe69 100644 --- a/s3_test.go +++ b/s3_test.go @@ -5,10 +5,10 @@ package main import ( "context" - "io/ioutil" "net" "net/http" "net/http/httptest" + "os" "strings" "testing" "time" @@ -64,7 +64,7 @@ func TestS3Uploader(t *testing.T) { ReducedRedundancy: true, } uploader.Init() - f, _ := ioutil.TempFile("", "some-file") + f, _ := os.CreateTemp("", "some-file") input := event.CreatedFile{ Event: event.Event{ RequestId: 4342, diff --git a/selenoid.go b/selenoid.go index 12713670..8e1f3aa3 100644 --- a/selenoid.go +++ b/selenoid.go @@ -10,7 +10,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "log" "net" "net/http" @@ -112,7 +111,7 @@ func create(w http.ResponseWriter, r *http.Request) { sessionStartTime := time.Now() requestId := serial() user, remote := util.RequestInfo(r) - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) r.Body.Close() if err != nil { log.Printf("[%d] [ERROR_READING_REQUEST] [%v]", requestId, err) @@ -680,7 +679,7 @@ func logs(w http.ResponseWriter, r *http.Request) { } func listFilesAsJson(requestId uint64, w http.ResponseWriter, dir string, errStatus string) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { log.Printf("[%d] [%s] [%s]", requestId, errStatus, fmt.Sprintf("Failed to list directory %s: %v", logOutputDir, err)) w.WriteHeader(http.StatusInternalServerError) diff --git a/selenoid_test.go b/selenoid_test.go index 9983d8d2..d15c1e5b 100644 --- a/selenoid_test.go +++ b/selenoid_test.go @@ -5,7 +5,7 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" + "io" "log" "net/http" "net/http/httptest" @@ -34,8 +34,8 @@ var ( func init() { enableFileUpload = true - videoOutputDir, _ = ioutil.TempDir("", "selenoid-test") - logOutputDir, _ = ioutil.TempDir("", "selenoid-test") + videoOutputDir, _ = os.MkdirTemp("", "selenoid-test") + logOutputDir, _ = os.MkdirTemp("", "selenoid-test") saveAllLogs = true gitRevision = "test-revision" ggrHost = &ggr.Host{ @@ -652,7 +652,7 @@ func TestFileUpload(t *testing.T) { f, err := os.Open(jsonResponse["value"]) AssertThat(t, err, Is{nil}) - content, err := ioutil.ReadAll(f) + content, err := io.ReadAll(f) AssertThat(t, err, Is{nil}) AssertThat(t, string(content), EqualTo{"Hello World!"}) @@ -720,7 +720,7 @@ func TestPing(t *testing.T) { AssertThat(t, rsp.Body, Is{Not{nil}}) var data map[string]interface{} - bt, readErr := ioutil.ReadAll(rsp.Body) + bt, readErr := io.ReadAll(rsp.Body) AssertThat(t, readErr, Is{nil}) jsonErr := json.Unmarshal(bt, &data) AssertThat(t, jsonErr, Is{nil}) @@ -743,7 +743,7 @@ func TestStatus(t *testing.T) { AssertThat(t, rsp.Body, Is{Not{nil}}) var data map[string]interface{} - bt, readErr := ioutil.ReadAll(rsp.Body) + bt, readErr := io.ReadAll(rsp.Body) AssertThat(t, readErr, Is{nil}) jsonErr := json.Unmarshal(bt, &data) AssertThat(t, jsonErr, Is{nil}) @@ -760,7 +760,7 @@ func TestStatus(t *testing.T) { func TestServeAndDeleteVideoFile(t *testing.T) { fileName := "testfile" filePath := filepath.Join(videoOutputDir, fileName) - ioutil.WriteFile(filePath, []byte("test-data"), 0644) + os.WriteFile(filePath, []byte("test-data"), 0644) rsp, err := http.Get(With(srv.URL).Path("/video/testfile")) AssertThat(t, err, Is{nil}) @@ -787,7 +787,7 @@ func TestServeAndDeleteVideoFile(t *testing.T) { func TestServeAndDeleteLogFile(t *testing.T) { fileName := "logfile.log" filePath := filepath.Join(logOutputDir, fileName) - ioutil.WriteFile(filePath, []byte("test-data"), 0644) + os.WriteFile(filePath, []byte("test-data"), 0644) rsp, err := http.Get(With(srv.URL).Path("/logs/logfile.log")) AssertThat(t, err, Is{nil}) @@ -822,7 +822,7 @@ func TestFileDownload(t *testing.T) { rsp, err := http.Get(With(srv.URL).Path(fmt.Sprintf("/download/%s/testfile", sess["sessionId"]))) AssertThat(t, err, Is{nil}) AssertThat(t, rsp, Code{http.StatusOK}) - data, err := ioutil.ReadAll(rsp.Body) + data, err := io.ReadAll(rsp.Body) AssertThat(t, err, Is{nil}) AssertThat(t, string(data), EqualTo{"test-data"}) @@ -848,7 +848,7 @@ func TestClipboard(t *testing.T) { rsp, err := http.Get(With(srv.URL).Path(fmt.Sprintf("/clipboard/%s", sess["sessionId"]))) AssertThat(t, err, Is{nil}) AssertThat(t, rsp, Code{http.StatusOK}) - data, err := ioutil.ReadAll(rsp.Body) + data, err := io.ReadAll(rsp.Body) AssertThat(t, err, Is{nil}) AssertThat(t, string(data), EqualTo{"test-clipboard-value"}) diff --git a/service_test.go b/service_test.go index 40d3d51c..b59f6289 100644 --- a/service_test.go +++ b/service_test.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "io" - "io/ioutil" "net" "net/http" "net/http/httptest" @@ -223,7 +222,7 @@ func testConfig(env *service.Environment) *config.Config { } func testEnvironment() *service.Environment { - logOutputDir, _ = ioutil.TempDir("", "selenoid-test") + logOutputDir, _ = os.MkdirTemp("", "selenoid-test") return &service.Environment{ CPU: int64(0), Memory: int64(0), From 20a511589bf5d2d79f728b14962078150205bb74 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sat, 20 Nov 2021 17:22:59 +0300 Subject: [PATCH 33/83] /clipboard and /download are available as protocol extension commands (fixes #399) --- selenoid.go | 13 ++++++++++++- selenoid_test.go | 30 +++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/selenoid.go b/selenoid.go index 8e1f3aa3..80d28dde 100644 --- a/selenoid.go +++ b/selenoid.go @@ -442,7 +442,7 @@ func getSessionTimeout(sessionTimeout string, maxTimeout time.Duration, defaultT if sessionTimeout != "" { st, err := time.ParseDuration(sessionTimeout) if err != nil { - return 0, fmt.Errorf("Invalid sessionTimeout capability: %v", err) + return 0, fmt.Errorf("invalid sessionTimeout capability: %v", err) } if st <= maxTimeout { return st, nil @@ -470,6 +470,8 @@ func generateRandomFileName(extension string) string { return "selenoid" + hex.EncodeToString(randBytes) + extension } +const vendorPrefix = "aerokube" + func proxy(w http.ResponseWriter, r *http.Request) { done := make(chan func()) go func() { @@ -486,6 +488,15 @@ func proxy(w http.ResponseWriter, r *http.Request) { id := fragments[2] sess, ok := sessions.Get(id) if ok { + if len(fragments) >= 4 && fragments[3] == vendorPrefix { + newFragments := []string{"", fragments[4], id} + if len(fragments) >= 5 { + newFragments = append(newFragments, fragments[5:]...) + } + r.URL.Host = (&request{r}).localaddr() + r.URL.Path = path.Clean(strings.Join(newFragments, slash)) + return + } sess.Lock.Lock() defer sess.Lock.Unlock() select { diff --git a/selenoid_test.go b/selenoid_test.go index d15c1e5b..a541cacf 100644 --- a/selenoid_test.go +++ b/selenoid_test.go @@ -811,6 +811,18 @@ func TestServeAndDeleteLogFile(t *testing.T) { } func TestFileDownload(t *testing.T) { + testFileDownload(t, func(sessionId string) string { + return fmt.Sprintf("/download/%s/testfile", sessionId) + }) +} + +func TestFileDownloadProtocolExtension(t *testing.T) { + testFileDownload(t, func(sessionId string) string { + return fmt.Sprintf("/wd/hub/session/%s/aerokube/download/testfile", sessionId) + }) +} + +func testFileDownload(t *testing.T, path func(string) string) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) @@ -819,7 +831,7 @@ func TestFileDownload(t *testing.T) { var sess map[string]string AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) - rsp, err := http.Get(With(srv.URL).Path(fmt.Sprintf("/download/%s/testfile", sess["sessionId"]))) + rsp, err := http.Get(With(srv.URL).Path(path(sess["sessionId"]))) AssertThat(t, err, Is{nil}) AssertThat(t, rsp, Code{http.StatusOK}) data, err := io.ReadAll(rsp.Body) @@ -837,6 +849,18 @@ func TestFileDownloadMissingSession(t *testing.T) { } func TestClipboard(t *testing.T) { + testClipboard(t, func(sessionId string) string { + return fmt.Sprintf("/clipboard/%s", sessionId) + }) +} + +func TestClipboardProtocolExtension(t *testing.T) { + testClipboard(t, func(sessionId string) string { + return fmt.Sprintf("/wd/hub/session/%s/aerokube/clipboard", sessionId) + }) +} + +func testClipboard(t *testing.T, path func(string) string) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) @@ -845,14 +869,14 @@ func TestClipboard(t *testing.T) { var sess map[string]string AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) - rsp, err := http.Get(With(srv.URL).Path(fmt.Sprintf("/clipboard/%s", sess["sessionId"]))) + rsp, err := http.Get(With(srv.URL).Path(path(sess["sessionId"]))) AssertThat(t, err, Is{nil}) AssertThat(t, rsp, Code{http.StatusOK}) data, err := io.ReadAll(rsp.Body) AssertThat(t, err, Is{nil}) AssertThat(t, string(data), EqualTo{"test-clipboard-value"}) - rsp, err = http.Post(With(srv.URL).Path(fmt.Sprintf("/clipboard/%s", sess["sessionId"])), "text/plain", bytes.NewReader([]byte("any-data"))) + rsp, err = http.Post(With(srv.URL).Path(path(sess["sessionId"])), "text/plain", bytes.NewReader([]byte("any-data"))) AssertThat(t, err, Is{nil}) AssertThat(t, rsp, Code{http.StatusOK}) From eb00b6c735b79dd690d0d5f87d7b2783537f1118 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Tue, 19 Apr 2022 18:32:16 +0300 Subject: [PATCH 34/83] Bump Golang to 1.18 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- ci/build.sh | 2 +- go.mod | 2 +- go.sum | 3 ++- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8f9d9a69..ff22c100 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.17.x + go-version: 1.18.x - uses: actions/cache@v1 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 40d0fd29..84b8ac73 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.17.x + go-version: 1.18.x - uses: actions/cache@v1 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a5572b6b..2d59054d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.17.x + go-version: 1.18.x - uses: actions/cache@v1 with: diff --git a/ci/build.sh b/ci/build.sh index a23f3c33..29c8056f 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -1,6 +1,6 @@ #!/bin/bash export GO111MODULE="on" -go get -u github.com/mitchellh/gox # cross compile +go install github.com/mitchellh/gox@latest # cross compile GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -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" gox -os "linux darwin windows" -arch "amd64" -osarch="darwin/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" diff --git a/go.mod b/go.mod index 4656a159..56e9dd99 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/opencontainers/go-digest v1.0.0-rc1 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect github.com/sirupsen/logrus v1.4.2 // indirect - golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect + golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 // indirect google.golang.org/grpc v1.21.1 // indirect gopkg.in/yaml.v2 v2.2.2 // indirect diff --git a/go.sum b/go.sum index 63111c75..962ddbdf 100644 --- a/go.sum +++ b/go.sum @@ -79,8 +79,9 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/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-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= From 4875704f5a5a79f45a6dc843bd038c5469dafbe8 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Tue, 19 Apr 2022 19:33:02 +0300 Subject: [PATCH 35/83] Not pushing to aandryashin/selenoid --- ci/docker-push.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/ci/docker-push.sh b/ci/docker-push.sh index 2391b712..b8330fa5 100755 --- a/ci/docker-push.sh +++ b/ci/docker-push.sh @@ -5,9 +5,7 @@ set -e docker build -t $GITHUB_REPOSITORY . docker tag $GITHUB_REPOSITORY $GITHUB_REPOSITORY:$1 docker tag $GITHUB_REPOSITORY selenoid/hub:$1 -docker tag $GITHUB_REPOSITORY aandryashin/selenoid:$1 docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" docker push $GITHUB_REPOSITORY docker push $GITHUB_REPOSITORY:$1 docker push selenoid/hub:$1 -docker push aandryashin/selenoid:$1 From d781a9d0398f517f4d8c347d94d21211c3a176e9 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Tue, 19 Apr 2022 19:33:37 +0300 Subject: [PATCH 36/83] Fixed old-school documentation URL --- doc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc.go b/doc.go index 84ecab89..a70b7154 100644 --- a/doc.go +++ b/doc.go @@ -1,4 +1,4 @@ /* -Selenoid is a powerful implementation of Selenium Hub using Docker or standalone web driver binaries to start and launch browsers. Documentation has moved to: http://github.com/aandryashin/selenoid +Selenoid is a powerful implementation of Selenium Hub using Docker or standalone web driver binaries to start and launch browsers. Documentation has moved to: https://aerokube.com/selenoid/latest. */ package main From 7e4f46ebb8544c6492bac45618f51584d254e5dd Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 15 Jun 2022 11:39:41 +0300 Subject: [PATCH 37/83] Building a binary for arm64 (related to #1107) --- ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index 29c8056f..33f8b2f4 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -3,4 +3,4 @@ export GO111MODULE="on" go install github.com/mitchellh/gox@latest # cross compile GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -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" -gox -os "linux darwin windows" -arch "amd64" -osarch="darwin/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" +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" From d11e601e1db092cb8903795f7829ff418528d964 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 15 Jun 2022 11:43:33 +0300 Subject: [PATCH 38/83] Removed cloud platforms section from docs --- docs/cloud-platforms.adoc | 54 ------------------------------------- docs/index.adoc | 3 --- docs/quick-start-guide.adoc | 5 ---- 3 files changed, 62 deletions(-) delete mode 100644 docs/cloud-platforms.adoc diff --git a/docs/cloud-platforms.adoc b/docs/cloud-platforms.adoc deleted file mode 100644 index 2187df2f..00000000 --- a/docs/cloud-platforms.adoc +++ /dev/null @@ -1,54 +0,0 @@ -== Cloud Platforms - -Selenoid ready-to-use images are present in popular cloud platforms and can be run in a few clicks. This section contains step-by-step instructions on launching Selenoid in these platforms. - -=== Google Cloud - -Selenoid can be run from https://console.cloud.google.com/marketplace[Google Cloud Marketplace] as follows: - -. Go to https://console.cloud.google.com/marketplace/details/aerokube/selenoid[Selenoid page] and click the **Launch on Compute Engine** button: -+ -image:img/google-cloud-marketplace-page.png[google-cloud-marketplace] - -. Type virtual machine name, size and click the **Deploy** button: -+ -image:img/google-cloud-vm-settings.png[google-cloud-vm-settings] - -. Wait for virtual machine to start. Selenoid user interface is available at `http://:8080/`. Selenium tests should be run against `http://:4444/wd/hub`. - -=== DigitalOcean - -Selenoid can be run from https://marketplace.digitalocean.com/[DigitalOcean Marketplace] as follows: - -. Go to https://marketplace.digitalocean.com/apps/selenoid[Selenoid page]: -+ -image:img/digitalocean-marketplace-page.png[digitalocean-marketplace] - -. Click on **Create Selenoid Droplet** button. -. Choose a plan, i.e. virtual machine size: -+ -image:img/digitalocean-vm-flavor.png[digitalocean-vm-flavor] -. Choose a data center region near you: -+ -image:img/digitalocean-vm-datacenter.png[digitalocean-vm-datacenter] - -. Select or add an SSH key for your droplet. -. Select a name for your virtual machine: -+ -image:img/digitalocean-vm-name.png[digitalocean-vm-name] -. Click on **Create Droplet** button. -. Wait for virtual machine to start. Selenoid user interface is available at `http://:8080/`. Selenium tests should be run against `http://:4444/wd/hub`. - -=== Yandex Cloud - -Selenoid can be run from https://cloud.yandex.com/marketplace[Yandex Cloud Marketplace] as follows: - -. Go to https://cloud.yandex.com/marketplace/products/f2e1m50sdg87g8eh716h[Selenoid page] and click the **Launch** button: -+ -image:img/yandex-cloud-marketplace-page.png[yandex-cloud-marketplace] - -. Type virtual machine name, select disk size, available computing resources and click the **Create VM** button: -+ -image:img/yandex-cloud-vm-settings.png[yandex-cloud-vm-settings] - -. Wait for virtual machine to start. Selenoid user interface is available at `http://:8080/`. Selenium tests should be run against `http://:4444/wd/hub`. diff --git a/docs/index.adoc b/docs/index.adoc index ab1c7b0a..8a316c17 100644 --- a/docs/index.adoc +++ b/docs/index.adoc @@ -53,6 +53,3 @@ include::contributing.adoc[] [appendix] include::browser-image-information.adoc[] - -[appendix] -include::cloud-platforms.adoc[] diff --git a/docs/quick-start-guide.adoc b/docs/quick-start-guide.adoc index b6cfff50..88290830 100644 --- a/docs/quick-start-guide.adoc +++ b/docs/quick-start-guide.adoc @@ -1,7 +1,6 @@ == Quick Start Guide === Start Selenoid -==== Option 1: you have a workstation, virtual machine or server . Make sure you have recent https://www.docker.com/[Docker] version installed. . Download http://aerokube.com/cm/latest/[Configuration Manager] (Selenoid quick installation binary) for your platform from https://github.com/aerokube/cm/releases/latest[releases] page. @@ -27,10 +26,6 @@ $ sudo usermod -aG docker $USER $ ./cm selenoid-ui start -==== Option 2: you have Google Cloud, DigitalOcean or Yandex Cloud - -We deliver ready to use images with Selenoid and Selenoid UI. Take a look at <> section for more details. - === Run Your Tests . Run your tests against Selenoid like you do with regular Selenium hub: From fa38d338c8198475d79663637c690e2d880e90b8 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Thu, 16 Jun 2022 20:00:46 +0300 Subject: [PATCH 39/83] Updated dependencies --- go.mod | 46 ++++++------ go.sum | 176 ++++++++++++++++++++++++++++++++++------------ service/docker.go | 4 +- 3 files changed, 154 insertions(+), 72 deletions(-) diff --git a/go.mod b/go.mod index 56e9dd99..15877c92 100644 --- a/go.mod +++ b/go.mod @@ -1,35 +1,33 @@ module github.com/aerokube/selenoid -go 1.17 +go 1.18 require ( github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e - github.com/aerokube/ggr v0.0.0-20181215175518-4a2e23fa1769 - github.com/aerokube/util v0.0.0-20190701120823-161c21b50f69 - github.com/aws/aws-sdk-go v1.20.12 - github.com/docker/docker v0.7.3-0.20190629173937-e105a74c5419 + github.com/aerokube/ggr v0.0.0-20220530075522-e83d8e58ba43 + github.com/aerokube/util v0.0.0-20200816065139-4ca0222e7686 + github.com/aws/aws-sdk-go v1.44.35 + github.com/docker/docker v20.10.17+incompatible github.com/docker/go-connections v0.4.0 github.com/docker/go-units v0.4.0 - github.com/gorilla/websocket v1.4.2 - github.com/imdario/mergo v0.3.6 - github.com/mafredri/cdp v0.21.0 - github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c - github.com/pkg/errors v0.8.1 - golang.org/x/net v0.0.0-20190311183353-d8887717615a + github.com/gorilla/websocket v1.5.0 + github.com/imdario/mergo v0.3.13 + github.com/mafredri/cdp v0.33.0 + github.com/pborman/uuid v1.2.1 + github.com/pkg/errors v0.9.1 + golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd ) require ( - github.com/Microsoft/go-winio v0.4.12 // indirect - github.com/docker/distribution v2.7.1+incompatible // indirect - github.com/gogo/protobuf v1.2.1 // indirect - github.com/golang/protobuf v1.2.0 // indirect - github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.1 // indirect - github.com/opencontainers/go-digest v1.0.0-rc1 // indirect - github.com/opencontainers/image-spec v1.0.1 // indirect - github.com/sirupsen/logrus v1.4.2 // indirect - golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect - google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 // indirect - google.golang.org/grpc v1.21.1 // indirect - gopkg.in/yaml.v2 v2.2.2 // indirect + github.com/Microsoft/go-winio v0.5.2 // indirect + github.com/docker/distribution v2.8.1+incompatible // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/uuid v1.0.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/sirupsen/logrus v1.7.0 // indirect + golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect + gotest.tools/v3 v3.2.0 // indirect ) diff --git a/go.sum b/go.sum index 962ddbdf..90e42660 100644 --- a/go.sum +++ b/go.sum @@ -1,101 +1,185 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Microsoft/go-winio v0.4.12 h1:xAfWHN1IrQ0NJ9TBC0KBZoqLjzDTr1ML+4MywiUOryc= github.com/Microsoft/go-winio v0.4.12/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/aandryashin/matchers v0.0.0-20160729131923-5eb67beb188b/go.mod h1:cbmYNkm9xeQlNoWEPtOUcvNok2gSD7ErMnYkRW+eHi8= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e h1:ogUKYFNcdYUIBSLibE4+EjbTJazoHr5JsWWx21Lpn8c= github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e/go.mod h1:cbmYNkm9xeQlNoWEPtOUcvNok2gSD7ErMnYkRW+eHi8= -github.com/aandryashin/reloader v0.0.0-20161127125235-da4f1b43ce40/go.mod h1:gvg2/m9OQ4ZwK4Qk/mnfgokCb4qDN4BGyle+QGw4VOc= -github.com/abbot/go-http-auth v0.0.0-20161224193827-d45c47bedec7/go.mod h1:Cz6ARTIzApMJDzh5bRMSUou6UMSp0IEXg9km/ci7TJM= -github.com/aerokube/ggr v0.0.0-20181215175518-4a2e23fa1769 h1:5UpE5f0xRoCgAcxFnT8h3EraWjg4cdX+HM6Hlh99LD4= -github.com/aerokube/ggr v0.0.0-20181215175518-4a2e23fa1769/go.mod h1:c4gg5wIR9PyppUSe4swKbNiSLO0vivf7THFs3rkcBIU= -github.com/aerokube/util v0.0.0-20190701120823-161c21b50f69 h1:fweUpmRn4GxKz+TFP9gmYs/k0unLEl5DJauqjwws7yI= -github.com/aerokube/util v0.0.0-20190701120823-161c21b50f69/go.mod h1:xhDPwF7O2YfPEAqVQNmeGldyPgNRC/V6ZRP/GtIr7Y4= -github.com/aws/aws-sdk-go v1.20.12 h1:xV7xfLSkiqd7JOnLlfER+Jz8kI98rAGJvtXssYkCRs4= -github.com/aws/aws-sdk-go v1.20.12/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aerokube/ggr v0.0.0-20220530075522-e83d8e58ba43 h1:xewBnJQEjosFfjB4qmOUvrrARwXMJOn63g1YbWstPiM= +github.com/aerokube/ggr v0.0.0-20220530075522-e83d8e58ba43/go.mod h1:pkFSXE9QudZDScqSugYzR/wTpkZNVRIotN+eCiDt7io= +github.com/aerokube/util v0.0.0-20200816065139-4ca0222e7686 h1:xEx4f96foPWF58CIfS6RMdmb/XzAWA3vaaXQ3udCS0o= +github.com/aerokube/util v0.0.0-20200816065139-4ca0222e7686/go.mod h1:7rDFREs/6NvZn+8FYx0aK/XNt8noC28QkybkbIUfWfw= +github.com/aws/aws-sdk-go v1.44.35 h1:2h93BS8/j1WUrr8CmALGwHYHTR+WYMZyDcINstX1+YM= +github.com/aws/aws-sdk-go v1.44.35/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/creack/pty v1.1.11/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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190629173937-e105a74c5419 h1:gui8HtKTBl1hF+CPmrprMfJVO4zjVEdwy4BLtZs24t4= +github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.7.3-0.20190629173937-e105a74c5419/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= +github.com/docker/docker v20.10.17+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.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/mafredri/cdp v0.21.0 h1:HHvwNtvQr+6Y91bqnDoO7q9j/KrYudoDvEmvsA34a9M= -github.com/mafredri/cdp v0.21.0/go.mod h1:hgdiA0yp1uqhSaDOHJWPgXpMbh+LAfUdD9vbN2AM8gE= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/mafredri/cdp v0.33.0 h1:McuQjNe0DyctTUxt8zY6jGTlpPoy2gciqxtvKhz0XPM= +github.com/mafredri/cdp v0.33.0/go.mod h1:Dbsh7eY/zhQlsddEDWzZGOztv9Jf2gzKq47M7a2P3C4= +github.com/mafredri/go-lint v0.0.0-20180911205320-920981dfc79e/go.mod h1:k/zdyxI3q6dup24o8xpYjJKTCf2F7rfxLp6w/efTiWs= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE= github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= +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.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c h1:MUyE44mTvnI5A0xrxIxaMqoWFzPfQvtE2IWUollMDMs= -github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= +github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -golang.org/x/crypto v0.0.0-20161221235747-f6b343c37ca8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210319071255-635bc2c9138d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.21.1 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= diff --git a/service/docker.go b/service/docker.go index 447309bc..1706bde5 100644 --- a/service/docker.go +++ b/service/docker.go @@ -152,7 +152,7 @@ func (d *Docker) StartWithCancel() (*StartedService, error) { Labels: getLabels(d.Service, d.Caps), }, &hostConfig, - &network.NetworkingConfig{}, "") + &network.NetworkingConfig{}, nil, "") if err != nil { return nil, fmt.Errorf("create container: %v", err) } @@ -527,7 +527,7 @@ func startVideoContainer(ctx context.Context, cl *client.Client, requestId uint6 Env: env, }, hostConfig, - &network.NetworkingConfig{}, "") + &network.NetworkingConfig{}, nil, "") if err != nil { removeContainer(ctx, cl, requestId, browserContainer.ID) return "", fmt.Errorf("create video container: %v", err) From e2587b9ebfab56daff58715cd1d7a67cf15b16fa Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Fri, 24 Jun 2022 18:34:15 +0300 Subject: [PATCH 40/83] Using host and port in Host header in container mode (related to #1193) --- selenoid.go | 9 ++++++++- service/docker.go | 6 ++++++ session/session.go | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/selenoid.go b/selenoid.go index 80d28dde..55a88103 100644 --- a/selenoid.go +++ b/selenoid.go @@ -200,6 +200,10 @@ func create(w http.ResponseWriter, r *http.Request) { } u := startedService.Url cancel := startedService.Cancel + host := "localhost" + if startedService.Container != nil { + host = startedService.Container.Origin + } var resp *http.Response i := 1 @@ -211,7 +215,7 @@ func create(w http.ResponseWriter, r *http.Request) { if len(contentType) > 0 { req.Header.Set("Content-Type", contentType) } - req.Host = "localhost" + req.Host = host ctx, done := context.WithTimeout(r.Context(), newSessionAttemptTimeout) defer done() log.Printf("[%d] [SESSION_ATTEMPTED] [%s] [%d]", requestId, u.String(), i) @@ -528,6 +532,9 @@ func proxy(w http.ResponseWriter, r *http.Request) { } r.URL.Host, r.URL.Path = sess.URL.Host, path.Clean(sess.URL.Path+r.URL.Path) r.Host = "localhost" + if sess.Container != nil { + r.Host = sess.Container.Origin + } return } r.URL.Path = paths.Error diff --git a/service/docker.go b/service/docker.go index 1706bde5..c79b673a 100644 --- a/service/docker.go +++ b/service/docker.go @@ -221,11 +221,17 @@ func (d *Docker) StartWithCancel() (*StartedService, error) { publishedPortsInfo = getContainerPorts(stat) } + var origin string + if stat.Config != nil { + origin = net.JoinHostPort(stat.Config.Hostname, d.Service.Port) + } + s := StartedService{ Url: u, Container: &session.Container{ ID: browserContainerId, IPAddress: getContainerIP(d.Environment.Network, stat), + Origin: origin, Ports: publishedPortsInfo, }, HostPort: hostPort, diff --git a/session/session.go b/session/session.go index 3327d77e..6beaf6ee 100644 --- a/session/session.go +++ b/session/session.go @@ -65,6 +65,7 @@ func (c *Caps) BrowserName() string { type Container struct { ID string `json:"id"` IPAddress string `json:"ip"` + Origin string `json:"origin,omitempty"` Ports map[string]string `json:"exposedPorts,omitempty"` } From 3c49924096cccc1c28abd7fb53e2f3530bccecc5 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sat, 25 Jun 2022 17:24:47 +0300 Subject: [PATCH 41/83] Automatically building image for linux/arm64 (related to #1107) --- .github/workflows/build.yml | 3 +++ .github/workflows/release.yml | 3 +++ Dockerfile | 2 +- ci/build.sh | 1 - ci/docker-push.sh | 7 +------ 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ff22c100..f74d70bf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,6 +23,9 @@ jobs: restore-keys: | ${{ runner.os }}-go- + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Test run: ci/test.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 84b8ac73..c371eede 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,6 +22,9 @@ jobs: restore-keys: | ${{ runner.os }}-go- + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Test run: ci/test.sh diff --git a/Dockerfile b/Dockerfile index 5a03836c..5cdcd766 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM alpine:3 RUN apk add -U ca-certificates tzdata mailcap && rm -Rf /var/cache/apk/* -COPY selenoid /usr/bin +COPY dist/selenoid_linux_$TARGETARCH /usr/bin/selenoid EXPOSE 4444 ENTRYPOINT ["/usr/bin/selenoid", "-listen", ":4444", "-conf", "/etc/selenoid/browsers.json", "-video-output-dir", "/opt/selenoid/video/"] diff --git a/ci/build.sh b/ci/build.sh index 33f8b2f4..c0894b7b 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -2,5 +2,4 @@ export GO111MODULE="on" go install github.com/mitchellh/gox@latest # cross compile -GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -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" 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" diff --git a/ci/docker-push.sh b/ci/docker-push.sh index b8330fa5..e2bb6a2e 100755 --- a/ci/docker-push.sh +++ b/ci/docker-push.sh @@ -2,10 +2,5 @@ set -e -docker build -t $GITHUB_REPOSITORY . -docker tag $GITHUB_REPOSITORY $GITHUB_REPOSITORY:$1 -docker tag $GITHUB_REPOSITORY selenoid/hub:$1 docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" -docker push $GITHUB_REPOSITORY -docker push $GITHUB_REPOSITORY:$1 -docker push selenoid/hub:$1 +docker buildx build --push -t "$GITHUB_REPOSITORY" -t "$GITHUB_REPOSITORY:$1" -t "selenoid/hub:$1" --platform linux/amd64,linux/arm64 . From b653c8b7939f468b5eb568fd211d0cfbcc0546bc Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sat, 25 Jun 2022 17:49:33 +0300 Subject: [PATCH 42/83] Explicitly declaring TARGETARCH variable --- Dockerfile | 4 +++- ci/docker-push.sh | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5cdcd766..f820c492 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,8 @@ -FROM alpine:3 +FROM --platform=$BUILDPLATFORM alpine:3 RUN apk add -U ca-certificates tzdata mailcap && rm -Rf /var/cache/apk/* + +ARG TARGETARCH COPY dist/selenoid_linux_$TARGETARCH /usr/bin/selenoid EXPOSE 4444 diff --git a/ci/docker-push.sh b/ci/docker-push.sh index e2bb6a2e..097009b3 100755 --- a/ci/docker-push.sh +++ b/ci/docker-push.sh @@ -3,4 +3,4 @@ set -e docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" -docker buildx build --push -t "$GITHUB_REPOSITORY" -t "$GITHUB_REPOSITORY:$1" -t "selenoid/hub:$1" --platform linux/amd64,linux/arm64 . +docker buildx build --pull --push -t "$GITHUB_REPOSITORY" -t "$GITHUB_REPOSITORY:$1" -t "selenoid/hub:$1" --platform linux/amd64,linux/arm64 . From c4b02dc8d4ff66aec64af23175b7a297ef09bd70 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 29 Jun 2022 18:23:46 +0300 Subject: [PATCH 43/83] Building all binaries with CGO_ENABLED=0 --- ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index c0894b7b..3514c1f7 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -2,4 +2,4 @@ export GO111MODULE="on" go install github.com/mitchellh/gox@latest # cross compile -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" +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" From 8a0f80a054e0c8c2ecf246c0d3e8278df0b2d07a Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Fri, 1 Jul 2022 14:24:56 +0300 Subject: [PATCH 44/83] Sending correct Host header in drivers mode too --- selenoid.go | 9 +++++---- service/docker.go | 2 +- service/driver.go | 2 +- service/service.go | 1 + session/session.go | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/selenoid.go b/selenoid.go index 55a88103..f914a128 100644 --- a/selenoid.go +++ b/selenoid.go @@ -201,8 +201,8 @@ func create(w http.ResponseWriter, r *http.Request) { u := startedService.Url cancel := startedService.Cancel host := "localhost" - if startedService.Container != nil { - host = startedService.Container.Origin + if startedService.Origin != "" { + host = startedService.Origin } var resp *http.Response @@ -300,6 +300,7 @@ func create(w http.ResponseWriter, r *http.Request) { URL: u, Container: startedService.Container, HostPort: startedService.HostPort, + Origin: startedService.Origin, Timeout: sessionTimeout, TimeoutCh: onTimeout(sessionTimeout, func() { request{r}.session(s.ID).Delete(requestId) @@ -532,8 +533,8 @@ func proxy(w http.ResponseWriter, r *http.Request) { } r.URL.Host, r.URL.Path = sess.URL.Host, path.Clean(sess.URL.Path+r.URL.Path) r.Host = "localhost" - if sess.Container != nil { - r.Host = sess.Container.Origin + if sess.Origin != "" { + r.Host = sess.Origin } return } diff --git a/service/docker.go b/service/docker.go index c79b673a..0334a62e 100644 --- a/service/docker.go +++ b/service/docker.go @@ -231,10 +231,10 @@ func (d *Docker) StartWithCancel() (*StartedService, error) { Container: &session.Container{ ID: browserContainerId, IPAddress: getContainerIP(d.Environment.Network, stat), - Origin: origin, Ports: publishedPortsInfo, }, HostPort: hostPort, + Origin: origin, Cancel: func() { if videoContainerId != "" { stopVideoContainer(ctx, cl, requestId, videoContainerId, d.Environment) diff --git a/service/driver.go b/service/driver.go index 587d37cd..25348eb0 100644 --- a/service/driver.go +++ b/service/driver.go @@ -81,7 +81,7 @@ func (d *Driver) StartWithCancel() (*StartedService, error) { if d.Caps.VNC { hp.VNC = "127.0.0.1:5900" } - return &StartedService{Url: u, HostPort: hp, Cancel: func() { d.stopProcess(cmd) }}, nil + return &StartedService{Url: u, HostPort: hp, Origin: fmt.Sprintf("localhost:%s", port), Cancel: func() { d.stopProcess(cmd) }}, nil } func (d *Driver) stopProcess(cmd *exec.Cmd) { diff --git a/service/service.go b/service/service.go index c46890e8..bcb17f3d 100644 --- a/service/service.go +++ b/service/service.go @@ -45,6 +45,7 @@ type StartedService struct { Url *url.URL Container *session.Container HostPort session.HostPort + Origin string Cancel func() } diff --git a/session/session.go b/session/session.go index 6beaf6ee..2a18bc50 100644 --- a/session/session.go +++ b/session/session.go @@ -65,7 +65,6 @@ func (c *Caps) BrowserName() string { type Container struct { ID string `json:"id"` IPAddress string `json:"ip"` - Origin string `json:"origin,omitempty"` Ports map[string]string `json:"exposedPorts,omitempty"` } @@ -76,6 +75,7 @@ type Session struct { URL *url.URL Container *Container HostPort HostPort + Origin string Cancel func() Timeout time.Duration TimeoutCh chan struct{} From 957d18809cc64b7bc09ef232fa8225f47285a535 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Tue, 15 Nov 2022 13:44:54 +0300 Subject: [PATCH 45/83] Bump Golang to 1.19 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- go.mod | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f74d70bf..0a1ee04a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.18.x + go-version: ~1.19.3 - uses: actions/cache@v1 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c371eede..91c64dd8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.18.x + go-version: ~1.19.3 - uses: actions/cache@v1 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2d59054d..1af71782 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v2 with: - go-version: 1.18.x + go-version: ~1.19.3 - uses: actions/cache@v1 with: diff --git a/go.mod b/go.mod index 15877c92..782d84ca 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/aerokube/selenoid -go 1.18 +go 1.19 require ( github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e From 6678bf346cd2390e6a01c592911bf28a8b0f133b Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Tue, 15 Nov 2022 13:48:35 +0300 Subject: [PATCH 46/83] Updated AWS client version --- go.mod | 6 +++--- go.sum | 30 +++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 782d84ca..03cf9be5 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e github.com/aerokube/ggr v0.0.0-20220530075522-e83d8e58ba43 github.com/aerokube/util v0.0.0-20200816065139-4ca0222e7686 - github.com/aws/aws-sdk-go v1.44.35 + github.com/aws/aws-sdk-go v1.44.137 github.com/docker/docker v20.10.17+incompatible github.com/docker/go-connections v0.4.0 github.com/docker/go-units v0.4.0 @@ -15,7 +15,7 @@ require ( github.com/mafredri/cdp v0.33.0 github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 - golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd + golang.org/x/net v0.1.0 ) require ( @@ -28,6 +28,6 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/sirupsen/logrus v1.7.0 // indirect - golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect + golang.org/x/sys v0.1.0 // indirect gotest.tools/v3 v3.2.0 // indirect ) diff --git a/go.sum b/go.sum index 90e42660..834e6180 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,8 @@ github.com/aerokube/ggr v0.0.0-20220530075522-e83d8e58ba43 h1:xewBnJQEjosFfjB4qm github.com/aerokube/ggr v0.0.0-20220530075522-e83d8e58ba43/go.mod h1:pkFSXE9QudZDScqSugYzR/wTpkZNVRIotN+eCiDt7io= github.com/aerokube/util v0.0.0-20200816065139-4ca0222e7686 h1:xEx4f96foPWF58CIfS6RMdmb/XzAWA3vaaXQ3udCS0o= github.com/aerokube/util v0.0.0-20200816065139-4ca0222e7686/go.mod h1:7rDFREs/6NvZn+8FYx0aK/XNt8noC28QkybkbIUfWfw= -github.com/aws/aws-sdk-go v1.44.35 h1:2h93BS8/j1WUrr8CmALGwHYHTR+WYMZyDcINstX1+YM= -github.com/aws/aws-sdk-go v1.44.35/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.137 h1:GH2bUPiW7/gHtB04NxQOSOrKqFNjLGKmqt5YaO+K1SE= +github.com/aws/aws-sdk-go v1.44.137/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -110,27 +110,33 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -138,20 +144,25 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210319071255-635bc2c9138d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -163,6 +174,7 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 60bc1a6422ea9c2c3d22d84f88f40edc5725b08e Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Tue, 15 Nov 2022 14:03:57 +0300 Subject: [PATCH 47/83] Added govulncheck to CI --- ci/test.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci/test.sh b/ci/test.sh index ae1da579..54dbccd7 100755 --- a/ci/test.sh +++ b/ci/test.sh @@ -2,3 +2,6 @@ export GO111MODULE="on" 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 + +go install golang.org/x/vuln/cmd/govulncheck@latest +"$(go env GOPATH)"/bin/govulncheck -tags production ./... From e3e31bc61e43a7820dd2925311ed384d828973bc Mon Sep 17 00:00:00 2001 From: Boris Osipov Date: Fri, 3 Feb 2023 20:18:54 +0300 Subject: [PATCH 48/83] Use the appium:deviceName capability to find the specific browser as well. New Appium clients do not send the non-W3C deviceName capability. --- session/session.go | 9 ++++++++- utils_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/session/session.go b/session/session.go index 2a18bc50..3b730625 100644 --- a/session/session.go +++ b/session/session.go @@ -16,6 +16,7 @@ type Caps struct { W3CVersion string `json:"browserVersion,omitempty"` Platform string `json:"platform,omitempty"` W3CPlatform string `json:"platformName,omitempty"` + W3CDeviceName string `json:"appium:deviceName,omitempty"` ScreenResolution string `json:"screenResolution,omitempty"` Skin string `json:"skin,omitempty"` VNC bool `json:"enableVNC,omitempty"` @@ -47,6 +48,9 @@ func (c *Caps) ProcessExtensionCapabilities() { if c.W3CPlatform != "" { c.Platform = c.W3CPlatform } + if c.W3CDeviceName != "" { + c.DeviceName = c.W3CDeviceName + } if c.ExtensionCapabilities != nil { mergo.Merge(c, *c.ExtensionCapabilities, mergo.WithOverride) //We probably need to handle returned error @@ -58,7 +62,10 @@ func (c *Caps) BrowserName() string { if browserName != "" { return browserName } - return c.DeviceName + if c.DeviceName != "" { + return c.DeviceName + } + return c.W3CDeviceName } // Container - container information diff --git a/utils_test.go b/utils_test.go index 160afdd6..23d5682a 100644 --- a/utils_test.go +++ b/utils_test.go @@ -188,6 +188,7 @@ func TestProcessExtensionCapabilities(t *testing.T) { capsJson := `{ "version": "57.0", "browserName": "firefox", + "appium:deviceName": "android", "selenoid:options": { "name": "ExampleTestName", "enableVNC": true, @@ -206,6 +207,7 @@ func TestProcessExtensionCapabilities(t *testing.T) { caps.ProcessExtensionCapabilities() AssertThat(t, caps.Name, EqualTo{"firefox"}) AssertThat(t, caps.Version, EqualTo{"57.0"}) + AssertThat(t, caps.DeviceName, EqualTo{"android"}) AssertThat(t, caps.TestName, EqualTo{"ExampleTestName"}) AssertThat(t, caps.VNC, EqualTo{true}) AssertThat(t, caps.VideoFrameRate, EqualTo{uint16(24)}) @@ -250,3 +252,30 @@ func TestSumUsedTotalGreaterThanPending(t *testing.T) { AssertThat(t, queue.Pending(), EqualTo{0}) AssertThat(t, queue.Used(), EqualTo{2}) } + +func TestBrowserName(t *testing.T) { + var caps session.Caps + + var capsJson = `{ + "appium:deviceName": "iPhone 7" + }` + err := json.Unmarshal([]byte(capsJson), &caps) + AssertThat(t, err, Is{nil}) + AssertThat(t, caps.BrowserName(), EqualTo{"iPhone 7"}) + + capsJson = `{ + "deviceName": "android 11" + }` + err = json.Unmarshal([]byte(capsJson), &caps) + AssertThat(t, err, Is{nil}) + AssertThat(t, caps.BrowserName(), EqualTo{"android 11"}) + + capsJson = `{ + "deviceName": "android 11", + "appium:deviceName": "iPhone 7", + "browserName": "firefox" + }` + err = json.Unmarshal([]byte(capsJson), &caps) + AssertThat(t, err, Is{nil}) + AssertThat(t, caps.BrowserName(), EqualTo{"firefox"}) +} From ab995bfc0f77b404eef28f5971203758039a2bbd Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 6 Feb 2023 16:34:32 +0300 Subject: [PATCH 49/83] Golang 1.20 and fresh CI action versions --- .github/workflows/build.yml | 8 ++++---- .github/workflows/release.yml | 8 ++++---- .github/workflows/test.yml | 10 +++++----- go.mod | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0a1ee04a..52a3b6d0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,14 +9,14 @@ jobs: golang: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup Golang - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: ~1.19.3 + go-version: ~1.20 - - uses: actions/cache@v1 + - uses: actions/cache@v3 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 91c64dd8..36d4ff29 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,14 +8,14 @@ jobs: golang: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup Golang - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: ~1.19.3 + go-version: ~1.20 - - uses: actions/cache@v1 + - uses: actions/cache@v3 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1af71782..406cb9e3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,14 +7,14 @@ jobs: golang: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup Golang - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: ~1.19.3 + go-version: ~1.20 - - uses: actions/cache@v1 + - uses: actions/cache@v3 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} @@ -27,6 +27,6 @@ jobs: - name: Build run: ci/build.sh - - uses: codecov/codecov-action@v1 + - uses: codecov/codecov-action@v3 with: flags: go diff --git a/go.mod b/go.mod index 03cf9be5..c4b9a9dd 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/aerokube/selenoid -go 1.19 +go 1.20 require ( github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e From 1769da0eb18a73b1e2e8900ed6cbcbee1c206652 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Thu, 9 Feb 2023 19:44:35 +0300 Subject: [PATCH 50/83] Using more recent Docker client version (related to #1306) --- go.mod | 21 +++++++------- go.sum | 90 +++++++++++++++------------------------------------------- 2 files changed, 33 insertions(+), 78 deletions(-) diff --git a/go.mod b/go.mod index c4b9a9dd..f24ec47a 100644 --- a/go.mod +++ b/go.mod @@ -4,30 +4,29 @@ go 1.20 require ( github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e - github.com/aerokube/ggr v0.0.0-20220530075522-e83d8e58ba43 - github.com/aerokube/util v0.0.0-20200816065139-4ca0222e7686 - github.com/aws/aws-sdk-go v1.44.137 - github.com/docker/docker v20.10.17+incompatible + github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45 + github.com/aerokube/util v1.0.0 + github.com/aws/aws-sdk-go v1.44.197 + github.com/docker/docker v23.0.0+incompatible github.com/docker/go-connections v0.4.0 - github.com/docker/go-units v0.4.0 + github.com/docker/go-units v0.5.0 github.com/gorilla/websocket v1.5.0 github.com/imdario/mergo v0.3.13 github.com/mafredri/cdp v0.33.0 github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 - golang.org/x/net v0.1.0 + golang.org/x/net v0.5.0 ) require ( - github.com/Microsoft/go-winio v0.5.2 // indirect + github.com/Microsoft/go-winio v0.6.0 // indirect github.com/docker/distribution v2.8.1+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/sirupsen/logrus v1.7.0 // indirect - golang.org/x/sys v0.1.0 // indirect - gotest.tools/v3 v3.2.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/sys v0.4.0 // indirect + golang.org/x/tools v0.1.12 // indirect ) diff --git a/go.sum b/go.sum index 834e6180..75a1eb43 100644 --- a/go.sum +++ b/go.sum @@ -1,34 +1,26 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Microsoft/go-winio v0.4.12/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e h1:ogUKYFNcdYUIBSLibE4+EjbTJazoHr5JsWWx21Lpn8c= github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e/go.mod h1:cbmYNkm9xeQlNoWEPtOUcvNok2gSD7ErMnYkRW+eHi8= -github.com/aerokube/ggr v0.0.0-20220530075522-e83d8e58ba43 h1:xewBnJQEjosFfjB4qmOUvrrARwXMJOn63g1YbWstPiM= -github.com/aerokube/ggr v0.0.0-20220530075522-e83d8e58ba43/go.mod h1:pkFSXE9QudZDScqSugYzR/wTpkZNVRIotN+eCiDt7io= -github.com/aerokube/util v0.0.0-20200816065139-4ca0222e7686 h1:xEx4f96foPWF58CIfS6RMdmb/XzAWA3vaaXQ3udCS0o= -github.com/aerokube/util v0.0.0-20200816065139-4ca0222e7686/go.mod h1:7rDFREs/6NvZn+8FYx0aK/XNt8noC28QkybkbIUfWfw= -github.com/aws/aws-sdk-go v1.44.137 h1:GH2bUPiW7/gHtB04NxQOSOrKqFNjLGKmqt5YaO+K1SE= -github.com/aws/aws-sdk-go v1.44.137/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45 h1:c5tRxpN9LcoV/6rv69SXrNzT0EiXYNtufsqM8M7Gauc= +github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45/go.mod h1:ihsnG0Nf22lmjMKqK43xP2Iom8jnnD0oz9PkeWcRhNY= +github.com/aerokube/util v1.0.0 h1:46fky7Wr6lf7ozksiLPEs0fM+3Z2cjeBI3FZT/3H1QQ= +github.com/aerokube/util v1.0.0/go.mod h1:0shrio3aqMNAzf2mUewcOaLKql3ijfTsPQnMUnydj40= +github.com/aws/aws-sdk-go v1.44.197 h1:pkg/NZsov9v/CawQWy+qWVzJMIZRQypCtYjUBXFomF8= +github.com/aws/aws-sdk-go v1.44.197/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/creack/pty v1.1.11/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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190629173937-e105a74c5419/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v23.0.0+incompatible h1:L6c28tNyqZ4/ub9AZC9d5QUuunoHHfEH4/Ue+h/E5nE= +github.com/docker/docker v23.0.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.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +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/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -38,23 +30,16 @@ github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GO github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -66,43 +51,30 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/mafredri/cdp v0.33.0 h1:McuQjNe0DyctTUxt8zY6jGTlpPoy2gciqxtvKhz0XPM= github.com/mafredri/cdp v0.33.0/go.mod h1:Dbsh7eY/zhQlsddEDWzZGOztv9Jf2gzKq47M7a2P3C4= github.com/mafredri/go-lint v0.0.0-20180911205320-920981dfc79e/go.mod h1:k/zdyxI3q6dup24o8xpYjJKTCf2F7rfxLp6w/efTiWs= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE= -github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= 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.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -115,22 +87,20 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -139,21 +109,17 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+v golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210319071255-635bc2c9138d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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= @@ -161,37 +127,27 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= -gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= From c95b6181e82e93040c49bdff8af67443cd35cfe5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 Feb 2023 04:27:03 +0000 Subject: [PATCH 51/83] Bump golang.org/x/net from 0.5.0 to 0.7.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.5.0 to 0.7.0. - [Release notes](https://github.com/golang/net/releases) - [Commits](https://github.com/golang/net/compare/v0.5.0...v0.7.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index f24ec47a..6c5f57fa 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/mafredri/cdp v0.33.0 github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 - golang.org/x/net v0.5.0 + golang.org/x/net v0.7.0 ) require ( @@ -27,6 +27,6 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/sys v0.4.0 // indirect + golang.org/x/sys v0.5.0 // indirect golang.org/x/tools v0.1.12 // indirect ) diff --git a/go.sum b/go.sum index 75a1eb43..36e42734 100644 --- a/go.sum +++ b/go.sum @@ -99,8 +99,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -118,8 +118,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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= @@ -128,7 +128,7 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From bbe4a191d121416e193a11d060d05de60afa8c31 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Tue, 11 Apr 2023 11:13:34 +0300 Subject: [PATCH 52/83] Bump Golang to 1.20.3 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 52a3b6d0..1cac012a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20 + go-version: ~1.20.3 - uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 36d4ff29..3f1787fb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20 + go-version: ~1.20.3 - uses: actions/cache@v3 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 406cb9e3..9e3e2518 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20 + go-version: ~1.20.3 - uses: actions/cache@v3 with: From 67eb972ac979162159c9e0f110307e88072f9f3d Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Tue, 11 Apr 2023 12:02:12 +0300 Subject: [PATCH 53/83] Use default container hostname instead of localhost (fixes #1329) --- service/docker.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/service/docker.go b/service/docker.go index 0334a62e..6b407aa6 100644 --- a/service/docker.go +++ b/service/docker.go @@ -143,14 +143,18 @@ func (d *Docker) StartWithCancel() (*StartedService, error) { } cl := d.Client env := getEnv(d.ServiceBase, d.Caps) + cfg := &ctr.Config{ + Image: image.(string), + Env: env, + ExposedPorts: portConfig.ExposedPorts, + Labels: getLabels(d.Service, d.Caps), + } + hn := getContainerHostname(d.Caps) + if hn != "" { + cfg.Hostname = hn + } container, err := cl.ContainerCreate(ctx, - &ctr.Config{ - Hostname: getContainerHostname(d.Caps), - Image: image.(string), - Env: env, - ExposedPorts: portConfig.ExposedPorts, - Labels: getLabels(d.Service, d.Caps), - }, + cfg, &hostConfig, &network.NetworkingConfig{}, nil, "") if err != nil { @@ -405,7 +409,7 @@ func getContainerHostname(caps session.Caps) string { if caps.ContainerHostname != "" { return caps.ContainerHostname } - return "localhost" + return "" } func getExtraHosts(service *config.Browser, caps session.Caps) []string { From 1e356f7c45f33589dccf721ad88fc0e1d51737cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 May 2023 20:45:15 +0000 Subject: [PATCH 54/83] Bump github.com/docker/distribution Bumps [github.com/docker/distribution](https://github.com/docker/distribution) from 2.8.1+incompatible to 2.8.2+incompatible. - [Release notes](https://github.com/docker/distribution/releases) - [Commits](https://github.com/docker/distribution/compare/v2.8.1...v2.8.2) --- updated-dependencies: - dependency-name: github.com/docker/distribution dependency-type: indirect ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6c5f57fa..f2800741 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( require ( github.com/Microsoft/go-winio v0.6.0 // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect diff --git a/go.sum b/go.sum index 36e42734..2682d1ed 100644 --- a/go.sum +++ b/go.sum @@ -13,8 +13,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v23.0.0+incompatible h1:L6c28tNyqZ4/ub9AZC9d5QUuunoHHfEH4/Ue+h/E5nE= github.com/docker/docker v23.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= From 364aa9b6a4e0be8db1e577480f8755fdf919763c Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sun, 21 May 2023 20:40:34 +0300 Subject: [PATCH 55/83] Updated Docker client to 1.43 (related to #1340) --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- go.mod | 14 +++++++------- go.sum | 36 ++++++++++++++++++----------------- 5 files changed, 29 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1cac012a..17b72f44 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.3 + go-version: ~1.20.4 - uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3f1787fb..29a7f01a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.3 + go-version: ~1.20.4 - uses: actions/cache@v3 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9e3e2518..545ad8d1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.3 + go-version: ~1.20.4 - uses: actions/cache@v3 with: diff --git a/go.mod b/go.mod index f2800741..8652bb37 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,9 @@ go 1.20 require ( github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45 - github.com/aerokube/util v1.0.0 + github.com/aerokube/util v1.0.1 github.com/aws/aws-sdk-go v1.44.197 - github.com/docker/docker v23.0.0+incompatible + github.com/docker/docker v24.0.1+incompatible github.com/docker/go-connections v0.4.0 github.com/docker/go-units v0.5.0 github.com/gorilla/websocket v1.5.0 @@ -15,18 +15,18 @@ require ( github.com/mafredri/cdp v0.33.0 github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 - golang.org/x/net v0.7.0 + golang.org/x/net v0.10.0 ) require ( - github.com/Microsoft/go-winio v0.6.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/tools v0.1.12 // indirect + golang.org/x/mod v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/tools v0.9.1 // indirect ) diff --git a/go.sum b/go.sum index 2682d1ed..b1738adc 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,12 @@ -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e h1:ogUKYFNcdYUIBSLibE4+EjbTJazoHr5JsWWx21Lpn8c= github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e/go.mod h1:cbmYNkm9xeQlNoWEPtOUcvNok2gSD7ErMnYkRW+eHi8= github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45 h1:c5tRxpN9LcoV/6rv69SXrNzT0EiXYNtufsqM8M7Gauc= github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45/go.mod h1:ihsnG0Nf22lmjMKqK43xP2Iom8jnnD0oz9PkeWcRhNY= -github.com/aerokube/util v1.0.0 h1:46fky7Wr6lf7ozksiLPEs0fM+3Z2cjeBI3FZT/3H1QQ= -github.com/aerokube/util v1.0.0/go.mod h1:0shrio3aqMNAzf2mUewcOaLKql3ijfTsPQnMUnydj40= +github.com/aerokube/util v1.0.1 h1:AgZ4KyFIRHB6B7k4ypMXPYAv7TcjlhOHg7JDsqERc04= +github.com/aerokube/util v1.0.1/go.mod h1:rCvfLQKS1FYa4Jj1S7XTZF63jdPkld82FrcR0V2MRc0= github.com/aws/aws-sdk-go v1.44.197 h1:pkg/NZsov9v/CawQWy+qWVzJMIZRQypCtYjUBXFomF8= github.com/aws/aws-sdk-go v1.44.197/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -15,8 +15,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v23.0.0+incompatible h1:L6c28tNyqZ4/ub9AZC9d5QUuunoHHfEH4/Ue+h/E5nE= -github.com/docker/docker v23.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.1+incompatible h1:NxN81beIxDlUaVt46iUQrYHD9/W3u9EGl52r86O/IGw= +github.com/docker/docker v24.0.1+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= @@ -60,7 +60,7 @@ github.com/mafredri/cdp v0.33.0 h1:McuQjNe0DyctTUxt8zY6jGTlpPoy2gciqxtvKhz0XPM= github.com/mafredri/cdp v0.33.0/go.mod h1:Dbsh7eY/zhQlsddEDWzZGOztv9Jf2gzKq47M7a2P3C4= github.com/mafredri/go-lint v0.0.0-20180911205320-920981dfc79e/go.mod h1:k/zdyxI3q6dup24o8xpYjJKTCf2F7rfxLp6w/efTiWs= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= @@ -76,8 +76,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -90,8 +90,9 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -99,14 +100,14 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -118,8 +119,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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= @@ -128,7 +129,7 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -136,8 +137,9 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 4070cfc2dd43c54b0044d69b0001bc59e282382a Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Thu, 25 May 2023 19:10:40 +0300 Subject: [PATCH 56/83] Fixed contributing guide --- docs/contributing.adoc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/contributing.adoc b/docs/contributing.adoc index 080c3903..f941df74 100644 --- a/docs/contributing.adoc +++ b/docs/contributing.adoc @@ -30,8 +30,9 @@ To build Docker container type: [source,bash] ---- -$ GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -$ docker build -t selenoid:latest . +$ mkdir -p dist +$ GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o dist/selenoid_linux_amd64 +$ docker buildx build --pull --platform linux/amd64 -t selenoid:latest . ---- ==== From a057cf94747afa6c45263dc22abe4044fccbcf91 Mon Sep 17 00:00:00 2001 From: DudaGod Date: Mon, 19 Jun 2023 13:46:01 +0300 Subject: [PATCH 57/83] feat: support "se:cdp" capability --- selenoid.go | 47 ++++++++++++++++++++++++++++++++++++++++++----- selenoid_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/selenoid.go b/selenoid.go index f914a128..1f9a2ee2 100644 --- a/selenoid.go +++ b/selenoid.go @@ -281,12 +281,25 @@ func create(w http.ResponseWriter, r *http.Request) { w.WriteHeader(resp.StatusCode) } } else { - tee := io.TeeReader(resp.Body, w) - w.WriteHeader(resp.StatusCode) - json.NewDecoder(tee).Decode(&s) - if s.ID == "" { - s.ID = s.Value.ID + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Printf("[%d] [ERROR_READING_RESPONSE] [%v]", requestId, err) + queue.Drop() + cancel() + return } + newBody, sessionId, err := processBody(body, r.Host) + if err != nil { + log.Printf("[%d] [ERROR_PROCESSING_RESPONSE] [%v]", requestId, err) + queue.Drop() + cancel() + return + } + resp.Body = io.NopCloser(bytes.NewReader(newBody)) + resp.ContentLength = int64(len(newBody)) + w.WriteHeader(resp.StatusCode) + w.Write(newBody) + s.ID = sessionId } if s.ID == "" { log.Printf("[%d] [SESSION_FAILED] [%s] [%s]", requestId, u.String(), resp.Status) @@ -393,6 +406,30 @@ func removeSelenoidOptions(input []byte) []byte { return ret } +func processBody(input []byte, host string) ([]byte, string, error) { + body := make(map[string]interface{}) + sessionId := "" + err := json.Unmarshal(input, &body) + if err != nil { + return nil, sessionId, fmt.Errorf("parse body response: %v", err) + } + if raw, ok := body["value"]; ok { + if v, ok := raw.(map[string]interface{}); ok { + if raw, ok := v["capabilities"]; ok { + if c, ok := raw.(map[string]interface{}); ok { + sessionId = v["sessionId"].(string) + c["se:cdp"] = fmt.Sprintf("ws://%s/devtools/%s/", host, sessionId) + } + } + } + } + ret, err := json.Marshal(body) + if err != nil { + return nil, sessionId, fmt.Errorf("marshal response: %v", err) + } + return ret, sessionId, nil +} + func preprocessSessionId(sid string) string { if ggrHost != nil { return ggrHost.Sum() + sid diff --git a/selenoid_test.go b/selenoid_test.go index a541cacf..efeac113 100644 --- a/selenoid_test.go +++ b/selenoid_test.go @@ -916,6 +916,30 @@ func TestDevtools(t *testing.T) { queue.Release() } +func TestAddedSeCdpCapability(t *testing.T) { + manager = &HTTPTest{Handler: Selenium()} + + resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) + AssertThat(t, err, Is{nil}) + + var sess map[string]string + AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + + ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) + defer cancel() + + conn, err := rpcc.DialContext(ctx, sess["se:cdp"]) + AssertThat(t, err, Is{nil}) + defer conn.Close() + + c := cdp.NewClient(conn) + err = c.Page.Enable(ctx) + AssertThat(t, err, Is{nil}) + + sessions.Remove(sess["sessionId"]) + queue.Release() +} + func TestParseGgrHost(t *testing.T) { h := parseGgrHost("some-host.example.com:4444") AssertThat(t, h.Name, EqualTo{"some-host.example.com"}) From 68dd34ea7d1fc74872b1f01300e823c6c2b49936 Mon Sep 17 00:00:00 2001 From: DudaGod Date: Thu, 13 Jul 2023 11:39:27 +0300 Subject: [PATCH 58/83] fix: correctly parse sessionId for chrome less 75 --- selenoid.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/selenoid.go b/selenoid.go index 1f9a2ee2..1987d387 100644 --- a/selenoid.go +++ b/selenoid.go @@ -413,12 +413,19 @@ func processBody(input []byte, host string) ([]byte, string, error) { if err != nil { return nil, sessionId, fmt.Errorf("parse body response: %v", err) } - if raw, ok := body["value"]; ok { - if v, ok := raw.(map[string]interface{}); ok { - if raw, ok := v["capabilities"]; ok { - if c, ok := raw.(map[string]interface{}); ok { - sessionId = v["sessionId"].(string) - c["se:cdp"] = fmt.Sprintf("ws://%s/devtools/%s/", host, sessionId) + // handle jsonwp response from older browsers (chrome < 75) + if rawId, ok := body["sessionId"]; ok { + if si, ok := rawId.(string); ok { + sessionId = si + } + } else { + if raw, ok := body["value"]; ok { + if v, ok := raw.(map[string]interface{}); ok { + if raw, ok := v["capabilities"]; ok { + if c, ok := raw.(map[string]interface{}); ok { + sessionId = v["sessionId"].(string) + c["se:cdp"] = fmt.Sprintf("ws://%s/devtools/%s/", host, sessionId) + } } } } From e18077a6150938943958a6ff28a8497a457fbcdf Mon Sep 17 00:00:00 2001 From: DudaGod Date: Thu, 13 Jul 2023 12:18:56 +0300 Subject: [PATCH 59/83] test: up go to 1.20.6 to fix vulnerabilities --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 17b72f44..82efff99 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.4 + go-version: ~1.20.6 - uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 29a7f01a..9ed19d38 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.4 + go-version: ~1.20.6 - uses: actions/cache@v3 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 545ad8d1..073b4510 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.4 + go-version: ~1.20.6 - uses: actions/cache@v3 with: From 8725d7fe87c656b40090ed952b8ef4a7339f3b6b Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 7 Aug 2023 13:20:23 +0400 Subject: [PATCH 60/83] Bump Golang to 1.20.7 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 82efff99..de3c04f3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.6 + go-version: ~1.20.7 - uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9ed19d38..16c86fc2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.6 + go-version: ~1.20.7 - uses: actions/cache@v3 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 073b4510..e884b907 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.6 + go-version: ~1.20.7 - uses: actions/cache@v3 with: From b7c1329ec965e131f083484917329cfa9ef4fa83 Mon Sep 17 00:00:00 2001 From: guangwu Date: Wed, 20 Sep 2023 09:13:13 +0800 Subject: [PATCH 61/83] fix: address typo --- docs/docker-settings.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docker-settings.adoc b/docs/docker-settings.adoc index 6f182afb..32ff267b 100644 --- a/docs/docker-settings.adoc +++ b/docs/docker-settings.adoc @@ -12,7 +12,7 @@ # ifconfig | grep eth0 eth0 Link encap:Ethernet HWaddr 00:25:90:eb:fb:3e + -Now we are setting this Mac-adress for `docker0` virtual interface: +Now we are setting this Mac-address for `docker0` virtual interface: # ip link set docker0 address 00:25:90:eb:fb:3e From f3e9ebc58cace3b4e6b357bb451793029968a375 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 22:28:16 +0000 Subject: [PATCH 62/83] Bump golang.org/x/net from 0.10.0 to 0.17.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.10.0 to 0.17.0. - [Commits](https://github.com/golang/net/compare/v0.10.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 8652bb37..4fce5e32 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/mafredri/cdp v0.33.0 github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 - golang.org/x/net v0.10.0 + golang.org/x/net v0.17.0 ) require ( @@ -27,6 +27,6 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect golang.org/x/mod v0.10.0 // indirect - golang.org/x/sys v0.8.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/tools v0.9.1 // indirect ) diff --git a/go.sum b/go.sum index b1738adc..d222ddd9 100644 --- a/go.sum +++ b/go.sum @@ -100,8 +100,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -119,8 +119,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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= @@ -129,7 +129,7 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From dbedf71792310b94c4cb1a7dea2ca7c4a0b89626 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sat, 14 Oct 2023 15:15:43 +0300 Subject: [PATCH 63/83] Bump Golang to 1.21.3 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- go.mod | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index de3c04f3..73b739cb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.7 + go-version: ~1.21.3 - uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 16c86fc2..3302d23b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.7 + go-version: ~1.21.3 - uses: actions/cache@v3 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e884b907..d0e3b0d6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.20.7 + go-version: ~1.21.3 - uses: actions/cache@v3 with: diff --git a/go.mod b/go.mod index 4fce5e32..4d546153 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/aerokube/selenoid -go 1.20 +go 1.21 require ( github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e From a348ae06c8517334cb524465f4d2aafff6be1292 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:43:20 +0000 Subject: [PATCH 64/83] Bump github.com/docker/docker Bumps [github.com/docker/docker](https://github.com/docker/docker) from 24.0.1+incompatible to 24.0.7+incompatible. - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v24.0.1...v24.0.7) --- updated-dependencies: - dependency-name: github.com/docker/docker dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4d546153..61babcd5 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45 github.com/aerokube/util v1.0.1 github.com/aws/aws-sdk-go v1.44.197 - github.com/docker/docker v24.0.1+incompatible + github.com/docker/docker v24.0.7+incompatible github.com/docker/go-connections v0.4.0 github.com/docker/go-units v0.5.0 github.com/gorilla/websocket v1.5.0 diff --git a/go.sum b/go.sum index d222ddd9..559b2c7c 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,5 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e h1:ogUKYFNcdYUIBSLibE4+EjbTJazoHr5JsWWx21Lpn8c= @@ -15,8 +16,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.1+incompatible h1:NxN81beIxDlUaVt46iUQrYHD9/W3u9EGl52r86O/IGw= -github.com/docker/docker v24.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +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/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= @@ -61,9 +62,11 @@ github.com/mafredri/cdp v0.33.0/go.mod h1:Dbsh7eY/zhQlsddEDWzZGOztv9Jf2gzKq47M7a github.com/mafredri/go-lint v0.0.0-20180911205320-920981dfc79e/go.mod h1:k/zdyxI3q6dup24o8xpYjJKTCf2F7rfxLp6w/efTiWs= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= 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.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= @@ -78,6 +81,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -108,6 +112,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -130,8 +135,10 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -151,5 +158,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= +gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= From 2b0fa874be6a2fc4b457bc68e96704681d29aa79 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sun, 31 Dec 2023 12:32:28 +0300 Subject: [PATCH 65/83] Added stale.yml to close outdated issues --- .github/stale.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 00000000..129e3131 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,19 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - new-feature + - bug + - improvement + - docs +# Label to use when marking an issue as stale +staleLabel: stale +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false From 675a1fad82808db077797899800c4be445687d8c Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sun, 31 Dec 2023 12:36:04 +0300 Subject: [PATCH 66/83] Bump Golang to 1.21.5 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 73b739cb..4effa451 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.21.3 + go-version: ~1.21.5 - uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3302d23b..9e12797f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.21.3 + go-version: ~1.21.5 - uses: actions/cache@v3 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d0e3b0d6..61f37fed 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.21.3 + go-version: ~1.21.5 - uses: actions/cache@v3 with: From 4015eda33828e8b2c26d2f3b008534ba7257e812 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sun, 31 Dec 2023 15:46:25 +0300 Subject: [PATCH 67/83] Using github.com/stretchr/testify for tests --- config_test.go | 116 +++++----- go.mod | 5 +- go.sum | 8 +- s3_test.go | 42 ++-- selenoid_test.go | 554 ++++++++++++++++++++++++----------------------- service_test.go | 44 ++-- utils_test.go | 63 +++--- 7 files changed, 426 insertions(+), 406 deletions(-) diff --git a/config_test.go b/config_test.go index fbd200dc..39e7deec 100644 --- a/config_test.go +++ b/config_test.go @@ -6,9 +6,9 @@ import ( "os" "testing" - . "github.com/aandryashin/matchers" "github.com/aerokube/selenoid/config" "github.com/aerokube/selenoid/session" + assert "github.com/stretchr/testify/require" ) const testLogConf = "config/container-logs.json" @@ -34,15 +34,16 @@ func TestConfig(t *testing.T) { defer os.Remove(confFile) conf := config.NewConfig() err := conf.Load(confFile, testLogConf) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) } func TestConfigError(t *testing.T) { confFile := configfile(`{}`) - os.Remove(confFile) + _ = os.Remove(confFile) conf := config.NewConfig() err := conf.Load(confFile, testLogConf) - AssertThat(t, err.Error(), EqualTo{fmt.Sprintf("browsers config: read error: open %s: no such file or directory", confFile)}) + assert.Error(t, err) + assert.Equal(t, err.Error(), fmt.Sprintf("browsers config: read error: open %s: no such file or directory", confFile)) } func TestLogConfigError(t *testing.T) { @@ -50,7 +51,7 @@ func TestLogConfigError(t *testing.T) { defer os.Remove(confFile) conf := config.NewConfig() err := conf.Load(confFile, "some-missing-file") - AssertThat(t, err, Not{nil}) + assert.Error(t, err) } func TestConfigParseError(t *testing.T) { @@ -58,7 +59,8 @@ func TestConfigParseError(t *testing.T) { defer os.Remove(confFile) var conf config.Config err := conf.Load(confFile, testLogConf) - AssertThat(t, err.Error(), EqualTo{"browsers config: parse error: unexpected end of JSON input"}) + assert.Error(t, err) + assert.Equal(t, err.Error(), "browsers config: parse error: unexpected end of JSON input") } func TestConfigEmptyState(t *testing.T) { @@ -68,42 +70,42 @@ func TestConfigEmptyState(t *testing.T) { conf.Load(confFile, testLogConf) state := conf.State(session.NewMap(), 0, 0, 0) - AssertThat(t, state.Total, EqualTo{0}) - AssertThat(t, state.Queued, EqualTo{0}) - AssertThat(t, state.Pending, EqualTo{0}) - AssertThat(t, state.Used, EqualTo{0}) + assert.Equal(t, state.Total, 0) + assert.Equal(t, state.Queued, 0) + assert.Equal(t, state.Pending, 0) + assert.Equal(t, state.Used, 0) } func TestConfigNonEmptyState(t *testing.T) { confFile := configfile(`{}`) defer os.Remove(confFile) conf := config.NewConfig() - conf.Load(confFile, testLogConf) + _ = conf.Load(confFile, testLogConf) sessions := session.NewMap() sessions.Put("0", &session.Session{Caps: session.Caps{Name: "firefox", Version: "49.0"}, Quota: "unknown"}) state := conf.State(sessions, 1, 0, 0) - AssertThat(t, state.Total, EqualTo{1}) - AssertThat(t, state.Queued, EqualTo{0}) - AssertThat(t, state.Pending, EqualTo{0}) - AssertThat(t, state.Used, EqualTo{1}) - AssertThat(t, state.Browsers["firefox"]["49.0"]["unknown"].Count, EqualTo{1}) + assert.Equal(t, state.Total, 1) + assert.Equal(t, state.Queued, 0) + assert.Equal(t, state.Pending, 0) + assert.Equal(t, state.Used, 1) + assert.Equal(t, state.Browsers["firefox"]["49.0"]["unknown"].Count, 1) } func TestConfigEmptyVersions(t *testing.T) { confFile := configfile(`{"firefox":{}}`) defer os.Remove(confFile) conf := config.NewConfig() - conf.Load(confFile, testLogConf) + _ = conf.Load(confFile, testLogConf) sessions := session.NewMap() sessions.Put("0", &session.Session{Caps: session.Caps{Name: "firefox", Version: "49.0"}, Quota: "unknown"}) state := conf.State(sessions, 1, 0, 0) - AssertThat(t, state.Total, EqualTo{1}) - AssertThat(t, state.Queued, EqualTo{0}) - AssertThat(t, state.Pending, EqualTo{0}) - AssertThat(t, state.Used, EqualTo{1}) - AssertThat(t, state.Browsers["firefox"]["49.0"]["unknown"].Count, EqualTo{1}) + assert.Equal(t, state.Total, 1) + assert.Equal(t, state.Queued, 0) + assert.Equal(t, state.Pending, 0) + assert.Equal(t, state.Used, 1) + assert.Equal(t, state.Browsers["firefox"]["49.0"]["unknown"].Count, 1) } func TestConfigNonEmptyVersions(t *testing.T) { @@ -115,11 +117,11 @@ func TestConfigNonEmptyVersions(t *testing.T) { sessions := session.NewMap() sessions.Put("0", &session.Session{Caps: session.Caps{Name: "firefox", Version: "49.0"}, Quota: "unknown"}) state := conf.State(sessions, 1, 0, 0) - AssertThat(t, state.Total, EqualTo{1}) - AssertThat(t, state.Queued, EqualTo{0}) - AssertThat(t, state.Pending, EqualTo{0}) - AssertThat(t, state.Used, EqualTo{1}) - AssertThat(t, state.Browsers["firefox"]["49.0"]["unknown"].Count, EqualTo{1}) + assert.Equal(t, state.Total, 1) + assert.Equal(t, state.Queued, 0) + assert.Equal(t, state.Pending, 0) + assert.Equal(t, state.Used, 1) + assert.Equal(t, state.Browsers["firefox"]["49.0"]["unknown"].Count, 1) } func TestConfigFindMissingBrowser(t *testing.T) { @@ -129,7 +131,7 @@ func TestConfigFindMissingBrowser(t *testing.T) { conf.Load(confFile, testLogConf) _, _, ok := conf.Find("firefox", "") - AssertThat(t, ok, Is{false}) + assert.False(t, ok) } func TestConfigFindDefaultVersionError(t *testing.T) { @@ -139,65 +141,70 @@ func TestConfigFindDefaultVersionError(t *testing.T) { conf.Load(confFile, testLogConf) _, _, ok := conf.Find("firefox", "") - AssertThat(t, ok, Is{false}) + assert.False(t, ok) } func TestConfigFindDefaultVersion(t *testing.T) { confFile := configfile(`{"firefox":{"default":"49.0"}}`) defer os.Remove(confFile) conf := config.NewConfig() - conf.Load(confFile, testLogConf) + err := conf.Load(confFile, testLogConf) + assert.NoError(t, err) _, v, ok := conf.Find("firefox", "") - AssertThat(t, ok, Is{false}) - AssertThat(t, v, EqualTo{"49.0"}) + assert.False(t, ok) + assert.Equal(t, v, "49.0") } func TestConfigFindFoundByEmptyPrefix(t *testing.T) { confFile := configfile(`{"firefox":{"default":"49.0","versions":{"49.0":{}}}}`) defer os.Remove(confFile) conf := config.NewConfig() - conf.Load(confFile, testLogConf) + err := conf.Load(confFile, testLogConf) + assert.NoError(t, err) _, v, ok := conf.Find("firefox", "") - AssertThat(t, ok, Is{true}) - AssertThat(t, v, EqualTo{"49.0"}) + assert.True(t, ok) + assert.Equal(t, v, "49.0") } func TestConfigFindFoundByPrefix(t *testing.T) { confFile := configfile(`{"firefox":{"default":"49.0","versions":{"49.0":{}}}}`) defer os.Remove(confFile) conf := config.NewConfig() - conf.Load(confFile, testLogConf) + err := conf.Load(confFile, testLogConf) + assert.NoError(t, err) _, v, ok := conf.Find("firefox", "49") - AssertThat(t, ok, Is{true}) - AssertThat(t, v, EqualTo{"49.0"}) + assert.True(t, ok) + assert.Equal(t, v, "49.0") } func TestConfigFindFoundByMatch(t *testing.T) { confFile := configfile(`{"firefox":{"default":"49.0","versions":{"49.0":{}}}}`) defer os.Remove(confFile) conf := config.NewConfig() - conf.Load(confFile, testLogConf) + err := conf.Load(confFile, testLogConf) + assert.NoError(t, err) _, v, ok := conf.Find("firefox", "49.0") - AssertThat(t, ok, Is{true}) - AssertThat(t, v, EqualTo{"49.0"}) + assert.True(t, ok) + assert.Equal(t, v, "49.0") } func TestConfigFindImage(t *testing.T) { confFile := configfile(`{"firefox":{"default":"49.0","versions":{"49.0":{"image":"image","port":"5555", "path":"/"}}}}`) defer os.Remove(confFile) conf := config.NewConfig() - conf.Load(confFile, testLogConf) + err := conf.Load(confFile, testLogConf) + assert.NoError(t, err) b, v, ok := conf.Find("firefox", "49.0") - AssertThat(t, ok, Is{true}) - AssertThat(t, v, EqualTo{"49.0"}) - AssertThat(t, b.Image, EqualTo{"image"}) - AssertThat(t, b.Port, EqualTo{"5555"}) - AssertThat(t, b.Path, EqualTo{"/"}) + assert.True(t, ok) + assert.Equal(t, v, "49.0") + assert.Equal(t, b.Image, "image") + assert.Equal(t, b.Port, "5555") + assert.Equal(t, b.Path, "/") } func TestConfigConcurrentLoad(t *testing.T) { @@ -207,10 +214,10 @@ func TestConfigConcurrentLoad(t *testing.T) { done := make(chan struct{}) go func() { - conf.Load(confFile, testLogConf) + _ = conf.Load(confFile, testLogConf) done <- struct{}{} }() - conf.Load(confFile, testLogConf) + _ = conf.Load(confFile, testLogConf) <-done } @@ -219,15 +226,14 @@ func TestConfigConcurrentLoadAndRead(t *testing.T) { defer os.Remove(confFile) conf := config.NewConfig() err := conf.Load(confFile, testLogConf) - if err != nil { - t.Error(err) - } + assert.NoError(t, err) done := make(chan string) go func() { browser, _, _ := conf.Find("firefox", "") done <- browser.Tmpfs["/tmp"] }() - conf.Load(confFile, testLogConf) + err = conf.Load(confFile, testLogConf) + assert.NoError(t, err) <-done } @@ -236,9 +242,7 @@ func TestConfigConcurrentRead(t *testing.T) { defer os.Remove(confFile) var conf config.Config err := conf.Load(confFile, testLogConf) - if err != nil { - t.Error(err) - } + assert.NoError(t, err) done := make(chan string) go func() { browser, _, _ := conf.Find("firefox", "") diff --git a/go.mod b/go.mod index 61babcd5..3cc5bea9 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/aerokube/selenoid go 1.21 require ( - github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45 github.com/aerokube/util v1.0.1 github.com/aws/aws-sdk-go v1.44.197 @@ -15,18 +14,22 @@ require ( github.com/mafredri/cdp v0.33.0 github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 + github.com/stretchr/testify v1.8.4 golang.org/x/net v0.17.0 ) require ( github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/mod v0.10.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/tools v0.9.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 559b2c7c..04c78377 100644 --- a/go.sum +++ b/go.sum @@ -80,8 +80,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -151,12 +151,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= diff --git a/s3_test.go b/s3_test.go index 7ba0fe69..3ade1170 100644 --- a/s3_test.go +++ b/s3_test.go @@ -13,10 +13,10 @@ import ( "testing" "time" - . "github.com/aandryashin/matchers" "github.com/aerokube/selenoid/event" "github.com/aerokube/selenoid/session" "github.com/aerokube/selenoid/upload" + assert "github.com/stretchr/testify/require" ) var ( @@ -75,8 +75,8 @@ func TestS3Uploader(t *testing.T) { Type: "log", } uploaded, err := uploader.Upload(input) - AssertThat(t, err, Is{nil}) - AssertThat(t, uploaded, Is{true}) + assert.NoError(t, err) + assert.True(t, uploaded) } func TestGetKey(t *testing.T) { @@ -93,48 +93,48 @@ func TestGetKey(t *testing.T) { } key := upload.GetS3Key(testPattern, input) - AssertThat(t, key, EqualTo{"some-user/some-Session-id_internet-explorer_11_windows/log.txt"}) + assert.Equal(t, key, "some-user/some-Session-id_internet-explorer_11_windows/log.txt") input.Session.Caps.Name = "" input.Session.Caps.DeviceName = "internet explorer" key = upload.GetS3Key(testPattern, input) - AssertThat(t, key, EqualTo{"some-user/some-Session-id_internet-explorer_11_windows/log.txt"}) + assert.Equal(t, key, "some-user/some-Session-id_internet-explorer_11_windows/log.txt") input.Session.Caps.S3KeyPattern = "$quota/$fileType$fileExtension" key = upload.GetS3Key(testPattern, input) - AssertThat(t, key, EqualTo{"some-user/log.txt"}) + assert.Equal(t, key, "some-user/log.txt") input.Session.Caps.S3KeyPattern = "$fileName" key = upload.GetS3Key(testPattern, input) - AssertThat(t, key, EqualTo{"Some-File.txt"}) + assert.Equal(t, key, "Some-File.txt") } func TestFileMatches(t *testing.T) { matches, err := upload.FileMatches("", "", "any-file-name") - AssertThat(t, err, Is{nil}) - AssertThat(t, matches, Is{true}) + assert.NoError(t, err) + assert.True(t, matches) matches, err = upload.FileMatches("[", "", "/path/to/file.mp4") - AssertThat(t, err, Not{nil}) - AssertThat(t, matches, Is{false}) + assert.Error(t, err) + assert.False(t, matches) matches, err = upload.FileMatches("", "[", "/path/to/file.mp4") - AssertThat(t, err, Not{nil}) - AssertThat(t, matches, Is{false}) + assert.Error(t, err) + assert.False(t, matches) matches, err = upload.FileMatches("*.mp4", "", "/path/to/file.mp4") - AssertThat(t, err, Is{nil}) - AssertThat(t, matches, Is{true}) + assert.NoError(t, err) + assert.True(t, matches) matches, err = upload.FileMatches("*.mp4", "", "/path/to/file.log") - AssertThat(t, err, Is{nil}) - AssertThat(t, matches, Is{false}) + assert.NoError(t, err) + assert.False(t, matches) matches, err = upload.FileMatches("*.mp4", "", "/path/to/file.log") - AssertThat(t, err, Is{nil}) - AssertThat(t, matches, Is{false}) + assert.NoError(t, err) + assert.False(t, matches) matches, err = upload.FileMatches("", "*.log", "/path/to/file.log") - AssertThat(t, err, Is{nil}) - AssertThat(t, matches, Is{false}) + assert.NoError(t, err) + assert.False(t, matches) } diff --git a/selenoid_test.go b/selenoid_test.go index efeac113..357345a1 100644 --- a/selenoid_test.go +++ b/selenoid_test.go @@ -15,12 +15,11 @@ import ( "testing" "time" - . "github.com/aandryashin/matchers" - . "github.com/aandryashin/matchers/httpresp" ggr "github.com/aerokube/ggr/config" "github.com/aerokube/selenoid/config" "github.com/mafredri/cdp" "github.com/mafredri/cdp/rpcc" + assert "github.com/stretchr/testify/require" ) var _ = func() bool { @@ -49,56 +48,52 @@ func TestNewSessionWithGet(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} rsp, err := http.Get(With(srv.URL).Path("/wd/hub/session")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusMethodNotAllowed}) - - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusMethodNotAllowed) + assert.Equal(t, queue.Used(), 0) } func TestBadJsonFormat(t *testing.T) { rsp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", nil) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusBadRequest}) - - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusBadRequest) + assert.Equal(t, queue.Used(), 0) } func TestServiceStartupFailure(t *testing.T) { manager = &StartupError{} rsp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusInternalServerError}) - - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusInternalServerError) + assert.Equal(t, queue.Used(), 0) } func TestBrowserNotFound(t *testing.T) { manager = &BrowserNotFound{} rsp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusBadRequest}) - - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusBadRequest) + assert.Equal(t, queue.Used(), 0) } func TestGetDefaultScreenResolution(t *testing.T) { res, err := getScreenResolution("") - AssertThat(t, err, Is{nil}) - AssertThat(t, res, EqualTo{"1920x1080x24"}) + assert.NoError(t, err) + assert.Equal(t, res, "1920x1080x24") } func TestGetFullScreenResolution(t *testing.T) { res, err := getScreenResolution("1024x768x24") - AssertThat(t, err, Is{nil}) - AssertThat(t, res, EqualTo{"1024x768x24"}) + assert.NoError(t, err) + assert.Equal(t, res, "1024x768x24") } func TestGetShortScreenResolution(t *testing.T) { res, err := getScreenResolution("1024x768") - AssertThat(t, err, Is{nil}) - AssertThat(t, res, EqualTo{"1024x768x24"}) + assert.NoError(t, err) + assert.Equal(t, res, "1024x768x24") } func TestTooBigSessionTimeoutCapability(t *testing.T) { @@ -113,52 +108,48 @@ func testBadSessionTimeoutCapability(t *testing.T, timeoutValue string) { manager = &BrowserNotFound{} rsp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(fmt.Sprintf(`{"desiredCapabilities":{"sessionTimeout":"%s"}}`, timeoutValue)))) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusBadRequest}) - - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusBadRequest) + assert.Equal(t, queue.Used(), 0) } func TestMalformedScreenResolutionCapability(t *testing.T) { manager = &BrowserNotFound{} rsp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(`{"desiredCapabilities":{"screenResolution":"bad-resolution"}}`))) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusBadRequest}) - - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusBadRequest) + assert.Equal(t, queue.Used(), 0) } func TestGetVideoScreenSizeFromCapability(t *testing.T) { res, err := getVideoScreenSize("1024x768", "anything") - AssertThat(t, err, Is{nil}) - AssertThat(t, res, EqualTo{"1024x768"}) + assert.NoError(t, err) + assert.Equal(t, res, "1024x768") } func TestDetermineVideoScreenSizeFromScreenResolution(t *testing.T) { res, err := getVideoScreenSize("", "1024x768x24") - AssertThat(t, err, Is{nil}) - AssertThat(t, res, EqualTo{"1024x768"}) + assert.NoError(t, err) + assert.Equal(t, res, "1024x768") } func TestMalformedVideoScreenSizeCapability(t *testing.T) { manager = &BrowserNotFound{} rsp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(`{"desiredCapabilities":{"videoScreenSize":"bad-size"}}`))) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusBadRequest}) - - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusBadRequest) + assert.Equal(t, queue.Used(), 0) } func TestNewSessionNotFound(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} rsp, err := http.Get(With(srv.URL).Path("/wd/hub/session/123")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusNotFound}) - - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusNotFound) + assert.Equal(t, queue.Used(), 0) } func TestNewSessionHostDown(t *testing.T) { @@ -175,13 +166,13 @@ func TestNewSessionHostDown(t *testing.T) { } rsp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusInternalServerError}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusInternalServerError) canceled = <-ch - AssertThat(t, canceled, Is{true}) + assert.True(t, canceled) - AssertThat(t, queue.Used(), EqualTo{0}) + assert.Equal(t, queue.Used(), 0) } func TestNewSessionBadHostResponse(t *testing.T) { @@ -193,13 +184,12 @@ func TestNewSessionBadHostResponse(t *testing.T) { } rsp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusBadRequest}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusBadRequest) canceled = <-ch - AssertThat(t, canceled, Is{true}) - - AssertThat(t, queue.Used(), EqualTo{0}) + assert.True(t, canceled) + assert.Equal(t, queue.Used(), 0) } func TestSessionCreated(t *testing.T) { @@ -207,16 +197,18 @@ func TestSessionCreated(t *testing.T) { timeout = 5 * time.Second resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(`{"desiredCapabilities": {"enableVideo": true, "enableVNC": true, "sessionTimeout": "3s"}}`))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) resp, err = http.Get(With(srv.URL).Path("/status")) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var state config.State - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) - AssertThat(t, state.Used, EqualTo{1}) - AssertThat(t, queue.Used(), EqualTo{1}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&state)) + assert.Equal(t, state.Used, 1) + assert.Equal(t, queue.Used(), 1) sessions.Remove(sess["sessionId"]) queue.Release() } @@ -225,26 +217,28 @@ func TestSessionCreatedW3C(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(`{"capabilities":{"alwaysMatch":{"acceptInsecureCerts":true, "browserName":"firefox", "browserVersion":"latest", "selenoid:options":{"enableVNC": true}}}}`))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) resp, err = http.Get(With(srv.URL).Path("/status")) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var state config.State - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) - AssertThat(t, state.Used, EqualTo{1}) - AssertThat(t, queue.Used(), EqualTo{1}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&state)) + assert.Equal(t, state.Used, 1) + assert.Equal(t, queue.Used(), 1) versions, firefoxPresent := state.Browsers["firefox"] - AssertThat(t, firefoxPresent, Is{true}) + assert.True(t, firefoxPresent) users, versionPresent := versions["latest"] - AssertThat(t, versionPresent, Is{true}) + assert.True(t, versionPresent) userInfo, userPresent := users["unknown"] - AssertThat(t, userPresent, Is{true}) - AssertThat(t, userInfo, Not{nil}) - AssertThat(t, len(userInfo.Sessions), EqualTo{1}) - AssertThat(t, userInfo.Sessions[0].VNC, EqualTo{true}) + assert.True(t, userPresent) + assert.NotNil(t, userInfo) + assert.Len(t, userInfo.Sessions, 1) + assert.True(t, userInfo.Sessions[0].VNC) sessions.Remove(sess["sessionId"]) queue.Release() @@ -254,26 +248,28 @@ func TestSessionCreatedFirstMatchOnly(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(`{"capabilities":{"firstMatch":[{"browserName":"firefox", "browserVersion":"latest", "selenoid:options":{"enableVNC": true}}]}}`))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) resp, err = http.Get(With(srv.URL).Path("/status")) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var state config.State - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) - AssertThat(t, state.Used, EqualTo{1}) - AssertThat(t, queue.Used(), EqualTo{1}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&state)) + assert.Equal(t, state.Used, 1) + assert.Equal(t, queue.Used(), 1) versions, firefoxPresent := state.Browsers["firefox"] - AssertThat(t, firefoxPresent, Is{true}) + assert.True(t, firefoxPresent) users, versionPresent := versions["latest"] - AssertThat(t, versionPresent, Is{true}) + assert.True(t, versionPresent) userInfo, userPresent := users["unknown"] - AssertThat(t, userPresent, Is{true}) - AssertThat(t, userInfo, Not{nil}) - AssertThat(t, len(userInfo.Sessions), EqualTo{1}) - AssertThat(t, userInfo.Sessions[0].VNC, EqualTo{true}) + assert.True(t, userPresent) + assert.NotNil(t, userInfo) + assert.Len(t, userInfo.Sessions, 1) + assert.True(t, userInfo.Sessions[0].VNC) sessions.Remove(sess["sessionId"]) queue.Release() @@ -288,16 +284,18 @@ func TestSessionCreatedWdHub(t *testing.T) { manager = &HTTPTest{Handler: root} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) resp, err = http.Get(With(srv.URL).Path("/status")) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var state config.State - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) - AssertThat(t, state.Used, EqualTo{1}) - AssertThat(t, queue.Used(), EqualTo{1}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&state)) + assert.Equal(t, state.Used, 1) + assert.Equal(t, queue.Used(), 1) sessions.Remove(sess["sessionId"]) queue.Release() } @@ -306,22 +304,24 @@ func TestSessionWithContentTypeCreatedWdHub(t *testing.T) { root := http.NewServeMux() root.Handle("/wd/hub/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { r.URL.Path = strings.TrimPrefix(r.URL.Path, "/wd/hub") - AssertThat(t, r.Header.Get("Content-Type"), Is{"application/json; charset=utf-8"}) + assert.Equal(t, r.Header.Get("Content-Type"), "application/json; charset=utf-8") Selenium().ServeHTTP(w, r) })) manager = &HTTPTest{Handler: root} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "application/json; charset=utf-8", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) resp, err = http.Get(With(srv.URL).Path("/status")) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var state config.State - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) - AssertThat(t, state.Used, EqualTo{1}) - AssertThat(t, queue.Used(), EqualTo{1}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&state)) + assert.Equal(t, state.Used, 1) + assert.Equal(t, queue.Used(), 1) sessions.Remove(sess["sessionId"]) queue.Release() } @@ -333,15 +333,16 @@ func TestSessionFailedAfterTimeout(t *testing.T) { })} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - AssertThat(t, resp, AllOf{Code{http.StatusInternalServerError}}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusInternalServerError) resp, err = http.Get(With(srv.URL).Path("/status")) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var state config.State - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) - AssertThat(t, state.Used, EqualTo{0}) - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&state)) + assert.Equal(t, state.Used, 0) + assert.Equal(t, queue.Used(), 0) } func TestClientDisconnected(t *testing.T) { @@ -356,11 +357,12 @@ func TestClientDisconnected(t *testing.T) { cancel() resp, err := http.Get(With(srv.URL).Path("/status")) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var state config.State - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) - AssertThat(t, state.Used, EqualTo{0}) - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&state)) + assert.Equal(t, state.Used, 0) + assert.Equal(t, queue.Used(), 0) } func TestSessionFailedAfterTwoTimeout(t *testing.T) { @@ -371,15 +373,16 @@ func TestSessionFailedAfterTwoTimeout(t *testing.T) { })} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - AssertThat(t, resp, AllOf{Code{http.StatusInternalServerError}}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusInternalServerError) resp, err = http.Get(With(srv.URL).Path("/status")) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var state config.State - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) - AssertThat(t, state.Used, EqualTo{0}) - AssertThat(t, queue.Used(), EqualTo{0}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&state)) + assert.Equal(t, state.Used, 0) + assert.Equal(t, queue.Used(), 0) } func TestSessionCreatedRedirect(t *testing.T) { @@ -395,19 +398,19 @@ func TestSessionCreatedRedirect(t *testing.T) { manager = &HTTPTest{Handler: root} resp, err := httpClient.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - AssertThat(t, resp.StatusCode, Is{http.StatusFound}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusFound) location := resp.Header.Get("Location") - AssertThat(t, resp.StatusCode, Is{Not{""}}) fragments := strings.Split(location, "/") sid := fragments[len(fragments)-1] resp, err = http.Get(With(srv.URL).Path("/status")) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var state config.State - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) - AssertThat(t, state.Used, EqualTo{1}) - AssertThat(t, queue.Used(), EqualTo{1}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&state)) + assert.Equal(t, state.Used, 1) + assert.Equal(t, queue.Used(), 1) sessions.Remove(sid) queue.Release() } @@ -429,37 +432,38 @@ func TestSessionCreatedRemoveExtensionCapabilities(t *testing.T) { root := http.NewServeMux() root.Handle("/wd/hub/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { err := json.NewDecoder(r.Body).Decode(&browser) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) _, desiredCapabilitiesPresent = browser.Caps["selenoid:options"] _, alwaysMatchPresent = browser.W3CCaps.AlwaysMatch["selenoid:options"] _, chromeOptionsPresent = browser.W3CCaps.AlwaysMatch["goog:chromeOptions"] - AssertThat(t, len(browser.W3CCaps.FirstMatch), EqualTo{1}) + assert.Len(t, browser.W3CCaps.FirstMatch, 1) _, firstMatchPresent = browser.W3CCaps.FirstMatch[0]["selenoid:options"] })) manager = &HTTPTest{Handler: root} resp, err := httpClient.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(`{"desiredCapabilities": {"browserName": "chrome", "selenoid:options": {"enableVNC": true}}, "capabilities":{"alwaysMatch":{"browserName": "chrome", "goog:chromeOptions": {"args": ["headless"]}, "selenoid:options":{"enableVNC": true}}, "firstMatch": [{"platform": "linux", "selenoid:options": {"enableVideo": true}}]}}`))) - AssertThat(t, err, Is{nil}) - AssertThat(t, resp, Code{http.StatusOK}) - AssertThat(t, desiredCapabilitiesPresent, Is{false}) - AssertThat(t, alwaysMatchPresent, Is{false}) - AssertThat(t, chromeOptionsPresent, Is{true}) - AssertThat(t, firstMatchPresent, Is{false}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) + assert.False(t, desiredCapabilitiesPresent) + assert.False(t, alwaysMatchPresent) + assert.True(t, chromeOptionsPresent) + assert.False(t, firstMatchPresent) } func TestProxySession(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) resp, err = http.Get(With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/url", sess["sessionId"]))) - AssertThat(t, err, Is{nil}) - AssertThat(t, resp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) - AssertThat(t, queue.Used(), EqualTo{1}) + assert.Equal(t, queue.Used(), 1) sessions.Remove(sess["sessionId"]) queue.Release() } @@ -469,13 +473,14 @@ func TestProxySessionPanicOnAbortHandler(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) req, _ := http.NewRequest(http.MethodGet, With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/url?abort-handler=true", sess["sessionId"])), nil) resp, err = http.DefaultClient.Do(req) - AssertThat(t, err, Not{nil}) + assert.NoError(t, err) sessions.Remove(sess["sessionId"]) queue.Release() @@ -490,39 +495,42 @@ func TestSessionDeleted(t *testing.T) { } resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte(`{"desiredCapabilities": {"enableVideo": true}}`))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) req, _ := http.NewRequest(http.MethodDelete, With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s", sess["sessionId"])), nil) http.DefaultClient.Do(req) resp, err = http.Get(With(srv.URL).Path("/status")) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var state config.State - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&state}}) - AssertThat(t, state.Used, EqualTo{0}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&state)) + assert.Equal(t, state.Used, 0) canceled = <-ch - AssertThat(t, canceled, Is{true}) + assert.True(t, canceled) - AssertThat(t, queue.Used(), EqualTo{0}) + assert.Equal(t, queue.Used(), 0) } func TestSessionOnClose(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) req, _ := http.NewRequest(http.MethodDelete, With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/window", sess["sessionId"])), nil) - http.DefaultClient.Do(req) + _, _ = http.DefaultClient.Do(req) - AssertThat(t, queue.Used(), EqualTo{1}) + assert.Equal(t, queue.Used(), 1) sessions.Remove(sess["sessionId"]) queue.Release() } @@ -537,29 +545,30 @@ func TestProxySessionCanceled(t *testing.T) { timeout = 100 * time.Millisecond resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) _, ok := sessions.Get(sess["sessionId"]) - AssertThat(t, ok, Is{true}) + assert.True(t, ok) req, _ := http.NewRequest(http.MethodGet, With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/url?timeout=1s", sess["sessionId"])), nil) ctx, cancel := context.WithCancel(context.Background()) req = req.WithContext(ctx) go func() { - http.DefaultClient.Do(req) + _, _ = http.DefaultClient.Do(req) }() <-time.After(50 * time.Millisecond) cancel() <-time.After(100 * time.Millisecond) _, ok = sessions.Get(sess["sessionId"]) - AssertThat(t, ok, Is{false}) + assert.False(t, ok) canceled = <-ch - AssertThat(t, canceled, Is{true}) + assert.True(t, canceled) - AssertThat(t, queue.Used(), EqualTo{0}) + assert.Equal(t, queue.Used(), 0) } func TestNewSessionTimeout(t *testing.T) { @@ -572,21 +581,22 @@ func TestNewSessionTimeout(t *testing.T) { timeout = 30 * time.Millisecond resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) _, ok := sessions.Get(sess["sessionId"]) - AssertThat(t, ok, Is{true}) + assert.True(t, ok) <-time.After(50 * time.Millisecond) _, ok = sessions.Get(sess["sessionId"]) - AssertThat(t, ok, Is{false}) + assert.False(t, ok) canceled = <-ch - AssertThat(t, canceled, Is{true}) + assert.True(t, canceled) - AssertThat(t, queue.Used(), EqualTo{0}) + assert.Equal(t, queue.Used(), 0) } func TestProxySessionTimeout(t *testing.T) { @@ -599,63 +609,63 @@ func TestProxySessionTimeout(t *testing.T) { timeout = 30 * time.Millisecond resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) _, ok := sessions.Get(sess["sessionId"]) - AssertThat(t, ok, Is{true}) + assert.True(t, ok) <-time.After(20 * time.Millisecond) _, ok = sessions.Get(sess["sessionId"]) - AssertThat(t, ok, Is{true}) - http.Get(With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/url", sess["sessionId"]))) + assert.True(t, ok) + _, _ = http.Get(With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/url", sess["sessionId"]))) <-time.After(20 * time.Millisecond) _, ok = sessions.Get(sess["sessionId"]) - AssertThat(t, ok, Is{true}) + assert.True(t, ok) <-time.After(50 * time.Millisecond) _, ok = sessions.Get(sess["sessionId"]) - AssertThat(t, ok, Is{false}) + assert.False(t, ok) canceled = <-ch - AssertThat(t, canceled, Is{true}) + assert.True(t, canceled) - AssertThat(t, queue.Used(), EqualTo{0}) + assert.Equal(t, queue.Used(), 0) } func TestFileUpload(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) fileContents := []byte(`{"file":"UEsDBBQACAgIAJiC4koAAAAAAAAAAAAAAAAJAAAAaGVsbG8udHh080jNyclXCM8vyklRBABQSwcIoxwpHA4AAAAMAAAAUEsBAhQAFAAICAgAmILiSqMcKRwOAAAADAAAAAkAAAAAAAAAAAAAAAAAAAAAAGhlbGxvLnR4dFBLBQYAAAAAAQABADcAAABFAAAAAAA="}`) //Doing two times to test sequential upload resp, err = http.Post(With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/file", sess["sessionId"])), "", bytes.NewReader(fileContents)) - AssertThat(t, err, Is{nil}) - AssertThat(t, resp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) resp, err = http.Post(With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/file", sess["sessionId"])), "", bytes.NewReader(fileContents)) - AssertThat(t, err, Is{nil}) - AssertThat(t, resp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var jsonResponse map[string]string - - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&jsonResponse}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&jsonResponse)) f, err := os.Open(jsonResponse["value"]) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) content, err := io.ReadAll(f) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) - AssertThat(t, string(content), EqualTo{"Hello World!"}) + assert.Equal(t, string(content), "Hello World!") sessions.Remove(sess["sessionId"]) queue.Release() @@ -665,14 +675,14 @@ func TestFileUploadBadJson(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) resp, err = http.Post(With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/file", sess["sessionId"])), "", bytes.NewReader([]byte(`malformed json`))) - AssertThat(t, err, Is{nil}) - AssertThat(t, resp, Code{http.StatusBadRequest}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusBadRequest) sessions.Remove(sess["sessionId"]) queue.Release() @@ -682,14 +692,14 @@ func TestFileUploadNoFile(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) resp, err = http.Post(With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/file", sess["sessionId"])), "", bytes.NewReader([]byte(`{}`))) - AssertThat(t, err, Is{nil}) - AssertThat(t, resp, Code{http.StatusBadRequest}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusBadRequest) sessions.Remove(sess["sessionId"]) queue.Release() @@ -699,14 +709,14 @@ func TestFileUploadTwoFiles(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) resp, err = http.Post(With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/file", sess["sessionId"])), "", bytes.NewReader([]byte(`{"file":"UEsDBAoAAAAAAKGJ4koAAAAAAAAAAAAAAAAHABwAb25lLnR4dFVUCQADbv9YWZT/WFl1eAsAAQT1AQAABBQAAABQSwMECgAAAAAApIniSgAAAAAAAAAAAAAAAAcAHAB0d28udHh0VVQJAANz/1hZc/9YWXV4CwABBPUBAAAEFAAAAFBLAQIeAwoAAAAAAKGJ4koAAAAAAAAAAAAAAAAHABgAAAAAAAAAAACkgQAAAABvbmUudHh0VVQFAANu/1hZdXgLAAEE9QEAAAQUAAAAUEsBAh4DCgAAAAAApIniSgAAAAAAAAAAAAAAAAcAGAAAAAAAAAAAAKSBQQAAAHR3by50eHRVVAUAA3P/WFl1eAsAAQT1AQAABBQAAABQSwUGAAAAAAIAAgCaAAAAggAAAAAA"}`))) - AssertThat(t, err, Is{nil}) - AssertThat(t, resp, Code{http.StatusBadRequest}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusBadRequest) sessions.Remove(sess["sessionId"]) queue.Release() @@ -715,99 +725,99 @@ func TestFileUploadTwoFiles(t *testing.T) { func TestPing(t *testing.T) { rsp, err := http.Get(With(srv.URL).Path("/ping")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) - AssertThat(t, rsp.Body, Is{Not{nil}}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusOK) + assert.NotNil(t, rsp.Body) var data map[string]interface{} bt, readErr := io.ReadAll(rsp.Body) - AssertThat(t, readErr, Is{nil}) + assert.NoError(t, readErr) jsonErr := json.Unmarshal(bt, &data) - AssertThat(t, jsonErr, Is{nil}) + assert.NoError(t, jsonErr) _, hasUptime := data["uptime"] - AssertThat(t, hasUptime, Is{true}) + assert.True(t, hasUptime) _, hasLastReloadTime := data["lastReloadTime"] - AssertThat(t, hasLastReloadTime, Is{true}) + assert.True(t, hasLastReloadTime) _, hasNumRequests := data["numRequests"] - AssertThat(t, hasNumRequests, Is{true}) + assert.True(t, hasNumRequests) version, hasVersion := data["version"] - AssertThat(t, hasVersion, Is{true}) - AssertThat(t, version, EqualTo{"test-revision"}) + assert.True(t, hasVersion) + assert.Equal(t, version, "test-revision") } func TestStatus(t *testing.T) { rsp, err := http.Get(With(srv.URL).Path("/wd/hub/status")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) - AssertThat(t, rsp.Body, Is{Not{nil}}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusOK) + assert.NotNil(t, rsp.Body) var data map[string]interface{} bt, readErr := io.ReadAll(rsp.Body) - AssertThat(t, readErr, Is{nil}) + assert.NoError(t, readErr) jsonErr := json.Unmarshal(bt, &data) - AssertThat(t, jsonErr, Is{nil}) + assert.NoError(t, jsonErr) value, hasValue := data["value"] - AssertThat(t, hasValue, Is{true}) + assert.True(t, hasValue) valueMap := value.(map[string]interface{}) ready, hasReady := valueMap["ready"] - AssertThat(t, hasReady, Is{true}) - AssertThat(t, ready, Is{true}) + assert.True(t, hasReady) + assert.Equal(t, ready, true) _, hasMessage := valueMap["message"] - AssertThat(t, hasMessage, Is{true}) + assert.True(t, hasMessage) } func TestServeAndDeleteVideoFile(t *testing.T) { fileName := "testfile" filePath := filepath.Join(videoOutputDir, fileName) - os.WriteFile(filePath, []byte("test-data"), 0644) + _ = os.WriteFile(filePath, []byte("test-data"), 0644) rsp, err := http.Get(With(srv.URL).Path("/video/testfile")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusOK) rsp, err = http.Get(With(srv.URL).Path("/video/?json")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusOK) var files []string - AssertThat(t, rsp, IsJson{&files}) - AssertThat(t, files, EqualTo{[]string{"testfile"}}) + assert.NoError(t, json.NewDecoder(rsp.Body).Decode(&files)) + assert.Equal(t, files, []string{"testfile"}) deleteReq, _ := http.NewRequest(http.MethodDelete, With(srv.URL).Path("/video/testfile"), nil) rsp, err = http.DefaultClient.Do(deleteReq) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusOK) //Deleting already deleted file rsp, err = http.DefaultClient.Do(deleteReq) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusNotFound}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusNotFound) } func TestServeAndDeleteLogFile(t *testing.T) { fileName := "logfile.log" filePath := filepath.Join(logOutputDir, fileName) - os.WriteFile(filePath, []byte("test-data"), 0644) + _ = os.WriteFile(filePath, []byte("test-data"), 0644) rsp, err := http.Get(With(srv.URL).Path("/logs/logfile.log")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusOK) rsp, err = http.Get(With(srv.URL).Path("/logs/?json")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusOK) var files []string - AssertThat(t, rsp, IsJson{&files}) - AssertThat(t, len(files) > 0, Is{true}) + assert.NoError(t, json.NewDecoder(rsp.Body).Decode(&files)) + assert.True(t, len(files) > 0) deleteReq, _ := http.NewRequest(http.MethodDelete, With(srv.URL).Path("/logs/logfile.log"), nil) rsp, err = http.DefaultClient.Do(deleteReq) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusOK) rsp, err = http.DefaultClient.Do(deleteReq) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusNotFound}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusNotFound) } func TestFileDownload(t *testing.T) { @@ -826,17 +836,17 @@ func testFileDownload(t *testing.T, path func(string) string) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) rsp, err := http.Get(With(srv.URL).Path(path(sess["sessionId"]))) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) data, err := io.ReadAll(rsp.Body) - AssertThat(t, err, Is{nil}) - AssertThat(t, string(data), EqualTo{"test-data"}) + assert.NoError(t, err) + assert.Equal(t, string(data), "test-data") sessions.Remove(sess["sessionId"]) queue.Release() @@ -844,8 +854,8 @@ func testFileDownload(t *testing.T, path func(string) string) { func TestFileDownloadMissingSession(t *testing.T) { rsp, err := http.Get(With(srv.URL).Path("/download/missing-session/testfile")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusNotFound}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusNotFound) } func TestClipboard(t *testing.T) { @@ -864,21 +874,21 @@ func testClipboard(t *testing.T, path func(string) string) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) rsp, err := http.Get(With(srv.URL).Path(path(sess["sessionId"]))) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) data, err := io.ReadAll(rsp.Body) - AssertThat(t, err, Is{nil}) - AssertThat(t, string(data), EqualTo{"test-clipboard-value"}) + assert.NoError(t, err) + assert.Equal(t, string(data), "test-clipboard-value") rsp, err = http.Post(With(srv.URL).Path(path(sess["sessionId"])), "text/plain", bytes.NewReader([]byte("any-data"))) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) sessions.Remove(sess["sessionId"]) queue.Release() @@ -886,18 +896,18 @@ func testClipboard(t *testing.T, path func(string) string) { func TestClipboardMissingSession(t *testing.T) { rsp, err := http.Get(With(srv.URL).Path("/clipboard/missing-session")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusNotFound}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusNotFound) } func TestDevtools(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) u := fmt.Sprintf("ws://%s/devtools/%s", srv.Listener.Addr().String(), sess["sessionId"]) @@ -905,12 +915,12 @@ func TestDevtools(t *testing.T) { defer cancel() conn, err := rpcc.DialContext(ctx, u) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) defer conn.Close() c := cdp.NewClient(conn) err = c.Page.Enable(ctx) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) sessions.Remove(sess["sessionId"]) queue.Release() @@ -920,21 +930,21 @@ func TestAddedSeCdpCapability(t *testing.T) { manager = &HTTPTest{Handler: Selenium()} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) - AssertThat(t, err, Is{nil}) - + assert.NoError(t, err) + assert.Equal(t, resp.StatusCode, http.StatusOK) var sess map[string]string - AssertThat(t, resp, AllOf{Code{http.StatusOK}, IsJson{&sess}}) + assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) defer cancel() conn, err := rpcc.DialContext(ctx, sess["se:cdp"]) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) defer conn.Close() c := cdp.NewClient(conn) err = c.Page.Enable(ctx) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) sessions.Remove(sess["sessionId"]) queue.Release() @@ -942,16 +952,16 @@ func TestAddedSeCdpCapability(t *testing.T) { func TestParseGgrHost(t *testing.T) { h := parseGgrHost("some-host.example.com:4444") - AssertThat(t, h.Name, EqualTo{"some-host.example.com"}) - AssertThat(t, h.Port, EqualTo{4444}) + assert.Equal(t, h.Name, "some-host.example.com") + assert.Equal(t, h.Port, 4444) } func TestWelcomeScreen(t *testing.T) { rsp, err := http.Get(With(srv.URL).Path("/")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusOK) rsp, err = http.Get(With(srv.URL).Path("/wd/hub")) - AssertThat(t, err, Is{nil}) - AssertThat(t, rsp, Code{http.StatusOK}) + assert.NoError(t, err) + assert.Equal(t, rsp.StatusCode, http.StatusOK) } diff --git a/service_test.go b/service_test.go index b59f6289..86012f16 100644 --- a/service_test.go +++ b/service_test.go @@ -13,13 +13,13 @@ import ( "testing" "time" - . "github.com/aandryashin/matchers" "github.com/aerokube/selenoid/config" "github.com/aerokube/selenoid/service" "github.com/aerokube/selenoid/session" "github.com/aerokube/util" "github.com/docker/docker/api/types/container" "github.com/docker/docker/client" + assert "github.com/stretchr/testify/require" "golang.org/x/net/websocket" ) @@ -40,8 +40,8 @@ func updateMux(mux http.Handler) { lock.Lock() defer lock.Unlock() mockServer = httptest.NewServer(mux) - os.Setenv("DOCKER_HOST", "tcp://"+hostPort(mockServer.URL)) - os.Setenv("DOCKER_API_VERSION", "1.29") + _ = os.Setenv("DOCKER_HOST", "tcp://"+hostPort(mockServer.URL)) + _ = os.Setenv("DOCKER_API_VERSION", "1.29") cli, _ = client.NewClientWithOpts(client.FromEnv) } @@ -263,18 +263,18 @@ func TestFindDockerIPSpecified(t *testing.T) { func testDocker(t *testing.T, env *service.Environment, cfg *config.Config) { starter := createDockerStarter(t, env, cfg) startedService, err := starter.StartWithCancel() - AssertThat(t, err, Is{nil}) - AssertThat(t, startedService.Url, Not{nil}) - AssertThat(t, startedService.Container, Not{nil}) - AssertThat(t, startedService.Container.ID, EqualTo{"e90e34656806"}) - AssertThat(t, startedService.HostPort.VNC, EqualTo{"127.0.0.1:5900"}) - AssertThat(t, startedService.Cancel, Not{nil}) + assert.NoError(t, err) + assert.NotNil(t, startedService.Url) + assert.NotNil(t, startedService.Container) + assert.Equal(t, startedService.Container.ID, "e90e34656806") + assert.Equal(t, startedService.HostPort.VNC, "127.0.0.1:5900") + assert.NotNil(t, startedService.Cancel) startedService.Cancel() } func createDockerStarter(t *testing.T, env *service.Environment, cfg *config.Config) service.Starter { cli, err := client.NewClientWithOpts(client.FromEnv) - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) manager := service.DefaultManager{Environment: env, Client: cli, Config: cfg} caps := session.Caps{ DeviceName: "firefox", @@ -299,8 +299,8 @@ func createDockerStarter(t *testing.T, env *service.Environment, cfg *config.Con TestName: "my-cool-test", } starter, success := manager.Find(caps, 42) - AssertThat(t, success, Is{true}) - AssertThat(t, starter, Not{nil}) + assert.True(t, success) + assert.NotNil(t, starter) return starter } @@ -334,8 +334,8 @@ func TestDeleteContainerOnStartupError(t *testing.T) { env := testEnvironment() starter := createDockerStarter(t, env, testConfig(env)) _, err := starter.StartWithCancel() - AssertThat(t, err, Not{nil}) - AssertThat(t, numDeleteRequests, EqualTo{1}) + assert.NoError(t, err) + assert.Equal(t, numDeleteRequests, 1) } func TestFindDriver(t *testing.T) { @@ -347,8 +347,8 @@ func TestFindDriver(t *testing.T) { VNC: true, } starter, success := manager.Find(caps, 42) - AssertThat(t, success, Is{true}) - AssertThat(t, starter, Not{nil}) + assert.True(t, success) + assert.NotNil(t, starter) } func TestGetVNC(t *testing.T) { @@ -365,7 +365,7 @@ func TestGetVNC(t *testing.T) { defer sessions.Remove("test-session") u := fmt.Sprintf("ws://%s/vnc/test-session", util.HostPort(srv.URL)) - AssertThat(t, readDataFromWebSocket(t, u), EqualTo{"test-data"}) + assert.Equal(t, readDataFromWebSocket(t, u), "test-data") } func testTCPServer(data string) net.Listener { @@ -376,8 +376,8 @@ func testTCPServer(data string) net.Listener { if err != nil { continue } - io.WriteString(conn, data) - conn.Close() + _, _ = io.WriteString(conn, data) + _ = conn.Close() return } }() @@ -386,12 +386,12 @@ func testTCPServer(data string) net.Listener { func readDataFromWebSocket(t *testing.T, wsURL string) string { ws, err := websocket.Dial(wsURL, "", "http://localhost") - AssertThat(t, err, Is{nil}) + assert.NoError(t, err) var msg = make([]byte, 512) _, err = ws.Read(msg) msg = bytes.Trim(msg, "\x00") - //AssertThat(t, err, Is{nil}) + //assert.NoError(t, err) return string(msg) } @@ -409,5 +409,5 @@ func TestGetLogs(t *testing.T) { defer sessions.Remove("test-session") u := fmt.Sprintf("ws://%s/logs/test-session", util.HostPort(srv.URL)) - AssertThat(t, readDataFromWebSocket(t, u), EqualTo{"test-data"}) + assert.Equal(t, readDataFromWebSocket(t, u), "test-data") } diff --git a/utils_test.go b/utils_test.go index 23d5682a..e6338cd5 100644 --- a/utils_test.go +++ b/utils_test.go @@ -15,12 +15,12 @@ import ( "testing" "time" - . "github.com/aandryashin/matchers" "github.com/aerokube/selenoid/protect" "github.com/aerokube/selenoid/service" "github.com/aerokube/selenoid/session" "github.com/gorilla/websocket" "github.com/pborman/uuid" + assert "github.com/stretchr/testify/require" ) type HTTPTest struct { @@ -199,20 +199,20 @@ func TestProcessExtensionCapabilities(t *testing.T) { }` var caps session.Caps err := json.Unmarshal([]byte(capsJson), &caps) - AssertThat(t, err, Is{nil}) - AssertThat(t, caps.Name, EqualTo{"firefox"}) - AssertThat(t, caps.Version, EqualTo{"57.0"}) - AssertThat(t, caps.TestName, EqualTo{""}) + assert.NoError(t, err) + assert.Equal(t, caps.Name, "firefox") + assert.Equal(t, caps.Version, "57.0") + assert.Equal(t, caps.TestName, "") caps.ProcessExtensionCapabilities() - AssertThat(t, caps.Name, EqualTo{"firefox"}) - AssertThat(t, caps.Version, EqualTo{"57.0"}) - AssertThat(t, caps.DeviceName, EqualTo{"android"}) - AssertThat(t, caps.TestName, EqualTo{"ExampleTestName"}) - AssertThat(t, caps.VNC, EqualTo{true}) - AssertThat(t, caps.VideoFrameRate, EqualTo{uint16(24)}) - AssertThat(t, caps.Env, EqualTo{[]string{"LANG=de_DE.UTF-8"}}) - AssertThat(t, caps.Labels, EqualTo{map[string]string{"key": "value"}}) + assert.Equal(t, caps.Name, "firefox") + assert.Equal(t, caps.Version, "57.0") + assert.Equal(t, caps.DeviceName, "android") + assert.Equal(t, caps.TestName, "ExampleTestName") + assert.True(t, caps.VNC) + assert.Equal(t, caps.VideoFrameRate, uint16(24)) + assert.Equal(t, caps.Env, []string{"LANG=de_DE.UTF-8"}) + assert.Equal(t, caps.Labels, map[string]string{"key": "value"}) } func TestSumUsedTotalGreaterThanPending(t *testing.T) { @@ -230,27 +230,28 @@ func TestSumUsedTotalGreaterThanPending(t *testing.T) { u := srv.URL + "/" _, err := http.Get(u) - AssertThat(t, err, Is{nil}) - AssertThat(t, queue.Pending(), EqualTo{1}) + assert.NoError(t, err) + assert.Equal(t, queue.Pending(), 1) queue.Create() - AssertThat(t, queue.Pending(), EqualTo{0}) - AssertThat(t, queue.Used(), EqualTo{1}) + assert.Equal(t, queue.Pending(), 0) + assert.Equal(t, queue.Used(), 1) _, err = http.Get(u) - AssertThat(t, err, Is{nil}) - AssertThat(t, queue.Pending(), EqualTo{1}) + assert.NoError(t, err) + assert.Equal(t, queue.Pending(), 1) queue.Create() - AssertThat(t, queue.Pending(), EqualTo{0}) - AssertThat(t, queue.Used(), EqualTo{2}) + assert.Equal(t, queue.Pending(), 0) + assert.Equal(t, queue.Used(), 2) req, _ := http.NewRequest(http.MethodGet, u, nil) - ctx, _ := context.WithTimeout(context.Background(), 100*time.Millisecond) + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() req = req.WithContext(ctx) _, err = http.DefaultClient.Do(req) - AssertThat(t, err, Not{nil}) - AssertThat(t, queue.Pending(), EqualTo{0}) - AssertThat(t, queue.Used(), EqualTo{2}) + assert.NoError(t, err) + assert.Equal(t, queue.Pending(), 0) + assert.Equal(t, queue.Used(), 2) } func TestBrowserName(t *testing.T) { @@ -260,15 +261,15 @@ func TestBrowserName(t *testing.T) { "appium:deviceName": "iPhone 7" }` err := json.Unmarshal([]byte(capsJson), &caps) - AssertThat(t, err, Is{nil}) - AssertThat(t, caps.BrowserName(), EqualTo{"iPhone 7"}) + assert.NoError(t, err) + assert.Equal(t, caps.BrowserName(), "iPhone 7") capsJson = `{ "deviceName": "android 11" }` err = json.Unmarshal([]byte(capsJson), &caps) - AssertThat(t, err, Is{nil}) - AssertThat(t, caps.BrowserName(), EqualTo{"android 11"}) + assert.NoError(t, err) + assert.Equal(t, caps.BrowserName(), "android 11") capsJson = `{ "deviceName": "android 11", @@ -276,6 +277,6 @@ func TestBrowserName(t *testing.T) { "browserName": "firefox" }` err = json.Unmarshal([]byte(capsJson), &caps) - AssertThat(t, err, Is{nil}) - AssertThat(t, caps.BrowserName(), EqualTo{"firefox"}) + assert.NoError(t, err) + assert.Equal(t, caps.BrowserName(), "firefox") } From 7d916add429d2b87a166fe0b5fadf6e10dff08cc Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sun, 7 Jan 2024 12:02:11 +0300 Subject: [PATCH 68/83] Migrated state.yml to Github Action --- .github/stale.yml | 19 ------------------- .github/workflows/stale.yml | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 19 deletions(-) delete mode 100644 .github/stale.yml create mode 100644 .github/workflows/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index 129e3131..00000000 --- a/.github/stale.yml +++ /dev/null @@ -1,19 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 60 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - new-feature - - bug - - improvement - - docs -# Label to use when marking an issue as stale -staleLabel: stale -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 00000000..bca45536 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,23 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '30 1 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + stale-issue-message: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. + days-before-stale: 60 + days-before-close: 7 + stale-issue-label: stale + exempt-issue-labels: + - new-feature + - bug + - improvement + - docs From 841ca2eb528ae420cfe5dde3d3782a9538dd0d16 Mon Sep 17 00:00:00 2001 From: Eng Zer Jun Date: Sun, 7 Jan 2024 23:20:54 +0800 Subject: [PATCH 69/83] Replace `github.com/pborman/uuid` with `github.com/google/uuid` `github.com/pborman/uuid` is no longer being actively maintained (last release was 2019). So we should just use the newer `github.com/google/uuid`. Signed-off-by: Eng Zer Jun --- go.mod | 3 +-- go.sum | 6 ++---- utils_test.go | 4 ++-- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 3cc5bea9..1fb44132 100644 --- a/go.mod +++ b/go.mod @@ -9,10 +9,10 @@ require ( github.com/docker/docker v24.0.7+incompatible github.com/docker/go-connections v0.4.0 github.com/docker/go-units v0.5.0 + github.com/google/uuid v1.5.0 github.com/gorilla/websocket v1.5.0 github.com/imdario/mergo v0.3.13 github.com/mafredri/cdp v0.33.0 - github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.8.4 golang.org/x/net v0.17.0 @@ -23,7 +23,6 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/uuid v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect diff --git a/go.sum b/go.sum index 04c78377..708c8e4b 100644 --- a/go.sum +++ b/go.sum @@ -39,8 +39,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -71,8 +71,6 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= -github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/utils_test.go b/utils_test.go index e6338cd5..2bafa970 100644 --- a/utils_test.go +++ b/utils_test.go @@ -18,8 +18,8 @@ import ( "github.com/aerokube/selenoid/protect" "github.com/aerokube/selenoid/service" "github.com/aerokube/selenoid/session" + "github.com/google/uuid" "github.com/gorilla/websocket" - "github.com/pborman/uuid" assert "github.com/stretchr/testify/require" ) @@ -106,7 +106,7 @@ func Selenium() http.Handler { http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) return } - u := uuid.New() + u := uuid.NewString() lock.Lock() sessions[u] = struct{}{} lock.Unlock() From 849d14f5908f747889bf527cb55264a6981be080 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Tue, 9 Jan 2024 11:34:46 +0300 Subject: [PATCH 70/83] Fixed syntax in stale job --- .github/workflows/stale.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index bca45536..eec20e8e 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -16,8 +16,4 @@ jobs: days-before-stale: 60 days-before-close: 7 stale-issue-label: stale - exempt-issue-labels: - - new-feature - - bug - - improvement - - docs + exempt-issue-labels: new-feature,bug,improvement,docs From 8029d65ec09f5d6c7821408f8a6d55eb93da2bde Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 24 Jan 2024 18:02:48 +0300 Subject: [PATCH 71/83] Bump Goland to 1.21.6 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4effa451..02f25e0d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.21.5 + go-version: ~1.21.6 - uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9e12797f..f79ca457 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.21.5 + go-version: ~1.21.6 - uses: actions/cache@v3 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 61f37fed..ed14f0be 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.21.5 + go-version: ~1.21.6 - uses: actions/cache@v3 with: From 6363e9825f93266af27ecf2894380f5c87823091 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Thu, 25 Jan 2024 10:19:38 +0300 Subject: [PATCH 72/83] Updated Docker client and other dependencies (fixes #1397) --- ci/build.sh | 2 + ci/test.sh | 4 +- go.mod | 40 ++++++++---- go.sum | 131 ++++++++++++++++++++++---------------- info/info.go | 27 ++++++++ main.go | 67 ++++++++++++++++--- protect/queue.go | 8 +-- selenoid.go | 44 +++++++------ selenoid_test.go | 37 +++++++++-- service/docker.go | 18 +++--- service/driver.go | 10 +-- service/driver_unix.go | 2 +- service/driver_windows.go | 2 +- service/service.go | 2 +- service_test.go | 17 +++-- upload/uploader.go | 8 +-- utils_test.go | 22 ++++--- 17 files changed, 294 insertions(+), 147 deletions(-) create mode 100644 info/info.go diff --git a/ci/build.sh b/ci/build.sh index 3514c1f7..89e4ddf5 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -e + export GO111MODULE="on" go install github.com/mitchellh/gox@latest # cross compile 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" diff --git a/ci/test.sh b/ci/test.sh index 54dbccd7..796a126b 100755 --- a/ci/test.sh +++ b/ci/test.sh @@ -1,7 +1,9 @@ #!/bin/bash +set -e + export GO111MODULE="on" -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 +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 go install golang.org/x/vuln/cmd/govulncheck@latest "$(go env GOPATH)"/bin/govulncheck -tags production ./... diff --git a/go.mod b/go.mod index 1fb44132..7b9ffd5c 100644 --- a/go.mod +++ b/go.mod @@ -3,32 +3,46 @@ module github.com/aerokube/selenoid go 1.21 require ( - github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45 - github.com/aerokube/util v1.0.1 - github.com/aws/aws-sdk-go v1.44.197 - github.com/docker/docker v24.0.7+incompatible - github.com/docker/go-connections v0.4.0 + github.com/aerokube/ggr v0.0.0-20240109084922-a37629b63e72 + github.com/aws/aws-sdk-go v1.50.3 + github.com/docker/docker v25.0.1+incompatible + github.com/docker/go-connections v0.5.0 github.com/docker/go-units v0.5.0 - github.com/google/uuid v1.5.0 - github.com/gorilla/websocket v1.5.0 + github.com/google/uuid v1.6.0 + github.com/gorilla/websocket v1.5.1 github.com/imdario/mergo v0.3.13 - github.com/mafredri/cdp v0.33.0 + github.com/mafredri/cdp v0.34.1 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.8.4 - golang.org/x/net v0.17.0 + golang.org/x/net v0.20.0 ) require ( + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/containerd/log v0.1.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/tools v0.9.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect + go.opentelemetry.io/otel v1.22.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 // indirect + go.opentelemetry.io/otel/metric v1.22.0 // indirect + go.opentelemetry.io/otel/sdk v1.22.0 // indirect + go.opentelemetry.io/otel/trace v1.22.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.17.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/v3 v3.5.1 // indirect ) diff --git a/go.sum b/go.sum index 708c8e4b..fa9563b3 100644 --- a/go.sum +++ b/go.sum @@ -2,28 +2,35 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25 github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e h1:ogUKYFNcdYUIBSLibE4+EjbTJazoHr5JsWWx21Lpn8c= -github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e/go.mod h1:cbmYNkm9xeQlNoWEPtOUcvNok2gSD7ErMnYkRW+eHi8= -github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45 h1:c5tRxpN9LcoV/6rv69SXrNzT0EiXYNtufsqM8M7Gauc= -github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45/go.mod h1:ihsnG0Nf22lmjMKqK43xP2Iom8jnnD0oz9PkeWcRhNY= -github.com/aerokube/util v1.0.1 h1:AgZ4KyFIRHB6B7k4ypMXPYAv7TcjlhOHg7JDsqERc04= -github.com/aerokube/util v1.0.1/go.mod h1:rCvfLQKS1FYa4Jj1S7XTZF63jdPkld82FrcR0V2MRc0= -github.com/aws/aws-sdk-go v1.44.197 h1:pkg/NZsov9v/CawQWy+qWVzJMIZRQypCtYjUBXFomF8= -github.com/aws/aws-sdk-go v1.44.197/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aerokube/ggr v0.0.0-20240109084922-a37629b63e72 h1:qEvnGebmcJLlz3fi12Lkm7/Zs/bGRvTZAM2la4jDIJo= +github.com/aerokube/ggr v0.0.0-20240109084922-a37629b63e72/go.mod h1:sUiJLMjwnDBLwD6zVKz1LSgNaDkoc7hx55sMJiTt2bk= +github.com/aws/aws-sdk-go v1.50.3 h1:NnXC/ukOakZbBwQcwAzkAXYEB4SbWboP9TFx9vvhIrE= +github.com/aws/aws-sdk-go v1.50.3/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= -github.com/docker/distribution v2.8.2+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/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +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/docker v25.0.1+incompatible h1:k5TYd5rIVQRSqcTwCID+cyVA0yRg86+Pcrz1ls0/frA= +github.com/docker/docker v25.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= 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/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -35,16 +42,21 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +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/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +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/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -57,8 +69,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/mafredri/cdp v0.33.0 h1:McuQjNe0DyctTUxt8zY6jGTlpPoy2gciqxtvKhz0XPM= -github.com/mafredri/cdp v0.33.0/go.mod h1:Dbsh7eY/zhQlsddEDWzZGOztv9Jf2gzKq47M7a2P3C4= +github.com/mafredri/cdp v0.34.1 h1:EeLNc+6pkDx2hrAm1arIjiofoH0fM5On1uAFzcuUn+o= +github.com/mafredri/cdp v0.34.1/go.mod h1:Dbsh7eY/zhQlsddEDWzZGOztv9Jf2gzKq47M7a2P3C4= github.com/mafredri/go-lint v0.0.0-20180911205320-920981dfc79e/go.mod h1:k/zdyxI3q6dup24o8xpYjJKTCf2F7rfxLp6w/efTiWs= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= @@ -75,6 +87,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -84,71 +98,78 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= +go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= +go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0 h1:9M3+rhx7kZCIQQhQRYaZCdNu1V73tm4TvXs2ntl98C4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0/go.mod h1:noq80iT8rrHP1SfybmPiRGc9dc5M8RPmGvtwo7Oo7tc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 h1:FyjCyI9jVEfqhUh2MoSkmolPjfh5fp2hnV0b0irxH4Q= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0/go.mod h1:hYwym2nDEeZfG/motx0p7L7J1N1vyzIThemQsb4g2qY= +go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= +go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= +go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= +go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= +go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210319071255-635bc2c9138d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 h1:6GQBEOdGkX6MMTLT9V+TjtIRZCw9VPD5Z+yHY9wMgS0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= +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/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -157,7 +178,7 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= diff --git a/info/info.go b/info/info.go new file mode 100644 index 00000000..868471ea --- /dev/null +++ b/info/info.go @@ -0,0 +1,27 @@ +package info + +import ( + "net" + "net/http" + "time" +) + +func RequestInfo(r *http.Request) (string, string) { + const unknownUser = "unknown" + user := "" + if u, _, ok := r.BasicAuth(); ok { + user = u + } else { + user = unknownUser + } + remote := r.Header.Get("X-Forwarded-For") + if remote != "" { + return user, remote + } + remote, _, _ = net.SplitHostPort(r.RemoteAddr) + return user, remote +} + +func SecondsSince(start time.Time) float64 { + return time.Now().Sub(start).Seconds() +} diff --git a/main.go b/main.go index 9759211b..a4c0e9dc 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,8 @@ import ( "encoding/json" "flag" "fmt" + "github.com/aerokube/selenoid/info" + "github.com/docker/docker/api" "log" "net" "net/http" @@ -24,8 +26,6 @@ import ( "github.com/aerokube/selenoid/service" "github.com/aerokube/selenoid/session" "github.com/aerokube/selenoid/upload" - "github.com/aerokube/util" - "github.com/aerokube/util/docker" "github.com/docker/docker/client" "github.com/pkg/errors" "golang.org/x/net/websocket" @@ -187,7 +187,7 @@ func init() { } ip, _, _ := net.SplitHostPort(u.Host) environment.IP = ip - cli, err = docker.CreateCompatibleDockerClient( + cli, err = createCompatibleDockerClient( func(specifiedApiVersion string) { log.Printf("[-] [INIT] [Using Docker API version: %s]", specifiedApiVersion) }, @@ -204,6 +204,57 @@ func init() { manager = &service.DefaultManager{Environment: &environment, Client: cli, Config: conf} } +func createCompatibleDockerClient(onVersionSpecified, onVersionDetermined, onUsingDefaultVersion func(string)) (*client.Client, error) { + const dockerApiVersion = "DOCKER_API_VERSION" + dockerApiVersionEnv := os.Getenv(dockerApiVersion) + if dockerApiVersionEnv != "" { + onVersionSpecified(dockerApiVersionEnv) + } else { + maxMajorVersion, maxMinorVersion := parseVersion(api.DefaultVersion) + minMajorVersion, minMinorVersion := parseVersion("1.24") + for majorVersion := maxMajorVersion; majorVersion >= minMajorVersion; majorVersion-- { + for minorVersion := maxMinorVersion; minorVersion >= minMinorVersion; minorVersion-- { + apiVersion := fmt.Sprintf("%d.%d", majorVersion, minorVersion) + _ = os.Setenv(dockerApiVersion, apiVersion) + docker, err := client.NewClientWithOpts(client.FromEnv) + if err != nil { + return nil, err + } + if isDockerAPIVersionCorrect(docker) { + onVersionDetermined(apiVersion) + return docker, nil + } + _ = docker.Close() + } + } + onUsingDefaultVersion(api.DefaultVersion) + } + return client.NewClientWithOpts(client.FromEnv) +} + +func parseVersion(ver string) (int, int) { + const point = "." + pieces := strings.Split(ver, point) + major, err := strconv.Atoi(pieces[0]) + if err != nil { + return 0, 0 + } + minor, err := strconv.Atoi(pieces[1]) + if err != nil { + return 0, 0 + } + return major, minor +} + +func isDockerAPIVersionCorrect(docker *client.Client) bool { + ctx := context.Background() + apiInfo, err := docker.ServerVersion(ctx) + if err != nil { + return false + } + return apiInfo.APIVersion == docker.ClientVersion() +} + func parseGgrHost(s string) *ggr.Host { h, p, err := net.SplitHostPort(s) if err != nil { @@ -260,7 +311,7 @@ func post(next http.HandlerFunc) http.HandlerFunc { func ping(w http.ResponseWriter, _ *http.Request) { w.Header().Add("Content-Type", "application/json") - json.NewEncoder(w).Encode(struct { + _ = json.NewEncoder(w).Encode(struct { Uptime string `json:"uptime"` LastReloadTime string `json:"lastReloadTime"` NumRequests uint64 `json:"numRequests"` @@ -274,7 +325,7 @@ func video(w http.ResponseWriter, r *http.Request) { deleteFileIfExists(requestId, w, r, videoOutputDir, paths.Video, "DELETED_VIDEO_FILE") return } - user, remote := util.RequestInfo(r) + user, remote := info.RequestInfo(r) if _, ok := r.URL.Query()[jsonParam]; ok { listFilesAsJson(requestId, w, videoOutputDir, "VIDEO_ERROR") return @@ -285,7 +336,7 @@ func video(w http.ResponseWriter, r *http.Request) { } func deleteFileIfExists(requestId uint64, w http.ResponseWriter, r *http.Request, dir string, prefix string, status string) { - user, remote := util.RequestInfo(r) + user, remote := info.RequestInfo(r) fileName := strings.TrimPrefix(r.URL.Path, prefix) filePath := filepath.Join(dir, fileName) _, err := os.Stat(filePath) @@ -332,7 +383,7 @@ func handler() http.Handler { }) root.HandleFunc(paths.Status, func(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "application/json") - json.NewEncoder(w).Encode(conf.State(sessions, limit, queue.Queued(), queue.Pending())) + _ = json.NewEncoder(w).Encode(conf.State(sessions, limit, queue.Queued(), queue.Pending())) }) root.HandleFunc(paths.Ping, ping) root.Handle(paths.VNC, websocket.Handler(vnc)) @@ -383,7 +434,7 @@ func main() { sessions.Each(func(k string, s *session.Session) { if enableFileUpload { - os.RemoveAll(path.Join(os.TempDir(), k)) + _ = os.RemoveAll(path.Join(os.TempDir(), k)) } s.Cancel() }) diff --git a/protect/queue.go b/protect/queue.go index d6c3f28c..53c75893 100644 --- a/protect/queue.go +++ b/protect/queue.go @@ -2,13 +2,13 @@ package protect import ( "errors" + "github.com/aerokube/selenoid/info" "log" "math" "net/http" "time" "github.com/aerokube/selenoid/jsonerror" - "github.com/aerokube/util" ) // Queue - struct to hold a number of sessions @@ -47,9 +47,9 @@ func (q *Queue) Check(next http.HandlerFunc) http.HandlerFunc { <-q.limit default: if q.disabled { - user, remote := util.RequestInfo(r) + user, remote := info.RequestInfo(r) log.Printf("[-] [QUEUE_IS_FULL] [%s] [%s]", user, remote) - err := errors.New("Queue Is Full") + err := errors.New("queue is full") jsonerror.UnknownError(err).Encode(w) return } @@ -61,7 +61,7 @@ func (q *Queue) Check(next http.HandlerFunc) http.HandlerFunc { // Protect - handler to control limit of sessions func (q *Queue) Protect(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - user, remote := util.RequestInfo(r) + user, remote := info.RequestInfo(r) log.Printf("[-] [NEW_REQUEST] [%s] [%s]", user, remote) s := time.Now() go func() { diff --git a/selenoid.go b/selenoid.go index 1987d387..96e50843 100644 --- a/selenoid.go +++ b/selenoid.go @@ -9,6 +9,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/aerokube/selenoid/info" "io" "log" "net" @@ -27,7 +28,6 @@ import ( "github.com/aerokube/selenoid/jsonerror" "github.com/aerokube/selenoid/service" "github.com/aerokube/selenoid/session" - "github.com/aerokube/util" "github.com/docker/docker/api/types" "github.com/docker/docker/pkg/stdcopy" "github.com/imdario/mergo" @@ -110,9 +110,9 @@ func getSerial() uint64 { func create(w http.ResponseWriter, r *http.Request) { sessionStartTime := time.Now() requestId := serial() - user, remote := util.RequestInfo(r) + user, remote := info.RequestInfo(r) body, err := io.ReadAll(r.Body) - r.Body.Close() + _ = r.Body.Close() if err != nil { log.Printf("[%d] [ERROR_READING_REQUEST] [%v]", requestId, err) jsonerror.InvalidArgument(err).Encode(w) @@ -147,7 +147,7 @@ func create(w http.ResponseWriter, r *http.Request) { var finalVideoName, finalLogName string for _, fmc := range firstMatchCaps { caps = browser.Caps - mergo.Merge(&caps, *fmc) + _ = mergo.Merge(&caps, *fmc) caps.ProcessExtensionCapabilities() sessionTimeout, err = getSessionTimeout(caps.SessionTimeout, maxTimeout, timeout) if err != nil { @@ -223,7 +223,7 @@ func create(w http.ResponseWriter, r *http.Request) { select { case <-ctx.Done(): if rsp != nil { - rsp.Body.Close() + _ = rsp.Body.Close() } switch ctx.Err() { case context.DeadlineExceeded: @@ -235,7 +235,7 @@ func create(w http.ResponseWriter, r *http.Request) { log.Printf("[%d] [SESSION_FAILED] [%s] [%s]", requestId, u.String(), err) jsonerror.UnknownError(err).Encode(w) case context.Canceled: - log.Printf("[%d] [CLIENT_DISCONNECTED] [%s] [%s] [%.2fs]", requestId, user, remote, util.SecondsSince(sessionStartTime)) + log.Printf("[%d] [CLIENT_DISCONNECTED] [%s] [%s] [%.2fs]", requestId, user, remote, info.SecondsSince(sessionStartTime)) } queue.Drop() cancel() @@ -244,7 +244,7 @@ func create(w http.ResponseWriter, r *http.Request) { } if err != nil { if rsp != nil { - rsp.Body.Close() + _ = rsp.Body.Close() } log.Printf("[%d] [SESSION_FAILED] [%s] [%s]", requestId, u.String(), err) jsonerror.SessionNotCreated(err).Encode(w) @@ -286,6 +286,7 @@ func create(w http.ResponseWriter, r *http.Request) { log.Printf("[%d] [ERROR_READING_RESPONSE] [%v]", requestId, err) queue.Drop() cancel() + w.WriteHeader(resp.StatusCode) return } newBody, sessionId, err := processBody(body, r.Host) @@ -293,12 +294,13 @@ func create(w http.ResponseWriter, r *http.Request) { log.Printf("[%d] [ERROR_PROCESSING_RESPONSE] [%v]", requestId, err) queue.Drop() cancel() + w.WriteHeader(resp.StatusCode) return } resp.Body = io.NopCloser(bytes.NewReader(newBody)) resp.ContentLength = int64(len(newBody)) w.WriteHeader(resp.StatusCode) - w.Write(newBody) + _, _ = w.Write(newBody) s.ID = sessionId } if s.ID == "" { @@ -372,7 +374,7 @@ func create(w http.ResponseWriter, r *http.Request) { sess.Cancel = cancelAndRenameFiles sessions.Put(s.ID, sess) queue.Create() - log.Printf("[%d] [SESSION_CREATED] [%s] [%d] [%.2fs]", requestId, s.ID, i, util.SecondsSince(sessionStartTime)) + log.Printf("[%d] [SESSION_CREATED] [%s] [%d] [%.2fs]", requestId, s.ID, i, info.SecondsSince(sessionStartTime)) } func removeSelenoidOptions(input []byte) []byte { @@ -515,7 +517,7 @@ func getTemporaryFileName(dir string, extension string) string { func generateRandomFileName(extension string) string { randBytes := make([]byte, 16) - rand.Read(randBytes) + _, _ = rand.Read(randBytes) return "selenoid" + hex.EncodeToString(randBytes) + extension } @@ -555,7 +557,7 @@ func proxy(w http.ResponseWriter, r *http.Request) { } if r.Method == http.MethodDelete && len(fragments) == 3 { if enableFileUpload { - os.RemoveAll(filepath.Join(os.TempDir(), id)) + _ = os.RemoveAll(filepath.Join(os.TempDir(), id)) } cancel = sess.Cancel sessions.Remove(id) @@ -590,7 +592,7 @@ func proxy(w http.ResponseWriter, r *http.Request) { func defaultErrorHandler(requestId uint64) func(http.ResponseWriter, *http.Request, error) { return func(w http.ResponseWriter, r *http.Request, err error) { - user, remote := util.RequestInfo(r) + user, remote := info.RequestInfo(r) log.Printf("[%d] [CLIENT_DISCONNECTED] [%s] [%s] [Error: %v]", requestId, user, remote, err) w.WriteHeader(http.StatusBadGateway) } @@ -681,7 +683,7 @@ func fileUpload(w http.ResponseWriter, r *http.Request) { }{ V: fileName, } - json.NewEncoder(w).Encode(reply) + _ = json.NewEncoder(w).Encode(reply) } func vnc(wsconn *websocket.Conn) { @@ -702,11 +704,11 @@ func vnc(wsconn *websocket.Conn) { defer conn.Close() wsconn.PayloadType = websocket.BinaryFrame go func() { - io.Copy(wsconn, conn) - wsconn.Close() + _, _ = io.Copy(wsconn, conn) + _ = wsconn.Close() log.Printf("[%d] [VNC_SESSION_CLOSED] [%s]", requestId, sid) }() - io.Copy(conn, wsconn) + _, _ = io.Copy(conn, wsconn) log.Printf("[%d] [VNC_CLIENT_DISCONNECTED] [%s]", requestId, sid) } else { log.Printf("[%d] [VNC_NOT_ENABLED] [%s]", requestId, sid) @@ -728,7 +730,7 @@ func logs(w http.ResponseWriter, r *http.Request) { deleteFileIfExists(requestId, w, r, logOutputDir, paths.Logs, "DELETED_LOG_FILE") return } - user, remote := util.RequestInfo(r) + user, remote := info.RequestInfo(r) if _, ok := r.URL.Query()[jsonParam]; ok { listFilesAsJson(requestId, w, logOutputDir, "LOG_ERROR") return @@ -753,7 +755,7 @@ func listFilesAsJson(requestId uint64, w http.ResponseWriter, dir string, errSta ret = append(ret, f.Name()) } w.Header().Add("Content-Type", "application/json") - json.NewEncoder(w).Encode(ret) + _ = json.NewEncoder(w).Encode(ret) } func streamLogs(wsconn *websocket.Conn) { @@ -774,7 +776,7 @@ func streamLogs(wsconn *websocket.Conn) { } defer r.Close() wsconn.PayloadType = websocket.BinaryFrame - stdcopy.StdCopy(wsconn, wsconn, r) + _, _ = stdcopy.StdCopy(wsconn, wsconn, r) log.Printf("[%d] [CONTAINER_LOGS_DISCONNECTED] [%s]", requestId, sid) } else { log.Printf("[%d] [SESSION_NOT_FOUND] [%s]", requestId, sid) @@ -784,7 +786,7 @@ func streamLogs(wsconn *websocket.Conn) { func status(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") ready := limit > sessions.Len() - json.NewEncoder(w).Encode( + _ = json.NewEncoder(w).Encode( map[string]interface{}{ "value": map[string]interface{}{ "message": fmt.Sprintf("Selenoid %s built at %s", gitRevision, buildStamp), @@ -795,7 +797,7 @@ func status(w http.ResponseWriter, _ *http.Request) { func welcome(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) - w.Write([]byte(fmt.Sprintf("You are using Selenoid %s!", gitRevision))) + _, _ = w.Write([]byte(fmt.Sprintf("You are using Selenoid %s!", gitRevision))) } func onTimeout(t time.Duration, f func()) chan struct{} { diff --git a/selenoid_test.go b/selenoid_test.go index 357345a1..ee09ece2 100644 --- a/selenoid_test.go +++ b/selenoid_test.go @@ -480,7 +480,7 @@ func TestProxySessionPanicOnAbortHandler(t *testing.T) { req, _ := http.NewRequest(http.MethodGet, With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s/url?abort-handler=true", sess["sessionId"])), nil) resp, err = http.DefaultClient.Do(req) - assert.NoError(t, err) + assert.Error(t, err) sessions.Remove(sess["sessionId"]) queue.Release() @@ -502,7 +502,8 @@ func TestSessionDeleted(t *testing.T) { req, _ := http.NewRequest(http.MethodDelete, With(srv.URL).Path(fmt.Sprintf("/wd/hub/session/%s", sess["sessionId"])), nil) - http.DefaultClient.Do(req) + _, err = http.DefaultClient.Do(req) + assert.NoError(t, err) resp, err = http.Get(With(srv.URL).Path("/status")) assert.NoError(t, err) @@ -927,18 +928,42 @@ func TestDevtools(t *testing.T) { } func TestAddedSeCdpCapability(t *testing.T) { - manager = &HTTPTest{Handler: Selenium()} + fn := func(input map[string]interface{}) { + input["value"] = map[string]interface{}{ + "sessionId": input["sessionId"], + "capabilities": make(map[string]interface{}), + } + delete(input, "sessionId") + } + manager = &HTTPTest{Handler: Selenium(fn)} resp, err := http.Post(With(srv.URL).Path("/wd/hub/session"), "", bytes.NewReader([]byte("{}"))) assert.NoError(t, err) assert.Equal(t, resp.StatusCode, http.StatusOK) - var sess map[string]string + var sess map[string]interface{} assert.NoError(t, json.NewDecoder(resp.Body).Decode(&sess)) ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) defer cancel() - conn, err := rpcc.DialContext(ctx, sess["se:cdp"]) + rv, ok := sess["value"] + assert.True(t, ok) + value, ok := rv.(map[string]interface{}) + assert.True(t, ok) + rc, ok := value["capabilities"] + assert.True(t, ok) + rs, ok := value["sessionId"] + assert.True(t, ok) + sessionId, ok := rs.(string) + assert.True(t, ok) + capabilities, ok := rc.(map[string]interface{}) + assert.True(t, ok) + rws, ok := capabilities["se:cdp"] + assert.True(t, ok) + ws, ok := rws.(string) + assert.True(t, ok) + assert.NotEmpty(t, ws) + conn, err := rpcc.DialContext(ctx, ws) assert.NoError(t, err) defer conn.Close() @@ -946,7 +971,7 @@ func TestAddedSeCdpCapability(t *testing.T) { err = c.Page.Enable(ctx) assert.NoError(t, err) - sessions.Remove(sess["sessionId"]) + sessions.Remove(sessionId) queue.Release() } diff --git a/service/docker.go b/service/docker.go index 6b407aa6..805e46bc 100644 --- a/service/docker.go +++ b/service/docker.go @@ -3,6 +3,8 @@ package service import ( "context" "fmt" + "github.com/aerokube/selenoid/info" + "github.com/docker/docker/api/types" "log" "net" "net/url" @@ -14,8 +16,6 @@ import ( "github.com/aerokube/selenoid/config" "github.com/aerokube/selenoid/session" - "github.com/aerokube/util" - "github.com/docker/docker/api/types" ctr "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/strslice" @@ -164,12 +164,12 @@ func (d *Docker) StartWithCancel() (*StartedService, error) { browserContainerId := container.ID videoContainerId := "" log.Printf("[%d] [STARTING_CONTAINER] [%s] [%s]", requestId, image, browserContainerId) - err = cl.ContainerStart(ctx, browserContainerId, types.ContainerStartOptions{}) + err = cl.ContainerStart(ctx, browserContainerId, ctr.StartOptions{}) if err != nil { removeContainer(ctx, cl, requestId, browserContainerId) return nil, fmt.Errorf("start container: %v", err) } - log.Printf("[%d] [CONTAINER_STARTED] [%s] [%s] [%.2fs]", requestId, image, browserContainerId, util.SecondsSince(browserContainerStartTime)) + log.Printf("[%d] [CONTAINER_STARTED] [%s] [%s] [%.2fs]", requestId, image, browserContainerId, info.SecondsSince(browserContainerStartTime)) if len(d.AdditionalNetworks) > 0 { for _, networkName := range d.AdditionalNetworks { @@ -217,7 +217,7 @@ func (d *Docker) StartWithCancel() (*StartedService, error) { removeContainer(ctx, cl, requestId, browserContainerId) return nil, fmt.Errorf("wait: %v", err) } - log.Printf("[%d] [SERVICE_STARTED] [%s] [%s] [%.2fs]", requestId, image, browserContainerId, util.SecondsSince(serviceStartTime)) + log.Printf("[%d] [SERVICE_STARTED] [%s] [%s] [%.2fs]", requestId, image, browserContainerId, info.SecondsSince(serviceStartTime)) log.Printf("[%d] [PROXY_TO] [%s] [%s]", requestId, browserContainerId, u.String()) var publishedPortsInfo map[string]string @@ -245,7 +245,7 @@ func (d *Docker) StartWithCancel() (*StartedService, error) { } defer removeContainer(ctx, cl, requestId, browserContainerId) if d.LogOutputDir != "" && (d.SaveAllLogs || d.Log) { - r, err := d.Client.ContainerLogs(ctx, browserContainerId, types.ContainerLogsOptions{ + r, err := d.Client.ContainerLogs(ctx, browserContainerId, ctr.LogsOptions{ Timestamps: true, ShowStdout: true, ShowStderr: true, @@ -545,13 +545,13 @@ func startVideoContainer(ctx context.Context, cl *client.Client, requestId uint6 videoContainerId := videoContainer.ID log.Printf("[%d] [STARTING_VIDEO_CONTAINER] [%s] [%s]", requestId, videoContainerImage, videoContainerId) - err = cl.ContainerStart(ctx, videoContainerId, types.ContainerStartOptions{}) + err = cl.ContainerStart(ctx, videoContainerId, ctr.StartOptions{}) if err != nil { removeContainer(ctx, cl, requestId, browserContainer.ID) removeContainer(ctx, cl, requestId, videoContainerId) return "", fmt.Errorf("start video container: %v", err) } - log.Printf("[%d] [VIDEO_CONTAINER_STARTED] [%s] [%s] [%.2fs]", requestId, videoContainerImage, videoContainerId, util.SecondsSince(videoContainerStartTime)) + log.Printf("[%d] [VIDEO_CONTAINER_STARTED] [%s] [%s] [%.2fs]", requestId, videoContainerImage, videoContainerId, info.SecondsSince(videoContainerStartTime)) return videoContainerId, nil } @@ -585,7 +585,7 @@ func stopVideoContainer(ctx context.Context, cli *client.Client, requestId uint6 func removeContainer(ctx context.Context, cli *client.Client, requestId uint64, id string) { log.Printf("[%d] [REMOVING_CONTAINER] [%s]", requestId, id) - err := cli.ContainerRemove(ctx, id, types.ContainerRemoveOptions{Force: true, RemoveVolumes: true}) + err := cli.ContainerRemove(ctx, id, ctr.RemoveOptions{Force: true, RemoveVolumes: true}) if err != nil { log.Printf("[%d] [FAILED_TO_REMOVE_CONTAINER] [%s] [%v]", requestId, id, err) return diff --git a/service/driver.go b/service/driver.go index 25348eb0..72b8a39e 100644 --- a/service/driver.go +++ b/service/driver.go @@ -3,6 +3,7 @@ package service import ( "errors" "fmt" + "github.com/aerokube/selenoid/info" "log" "net" "net/url" @@ -12,7 +13,6 @@ import ( "time" "github.com/aerokube/selenoid/session" - "github.com/aerokube/util" ) // Driver - driver processes manager @@ -63,7 +63,7 @@ func (d *Driver) StartWithCancel() (*StartedService, error) { cmd.Stdout = f cmd.Stderr = f } - l.Close() + _ = l.Close() log.Printf("[%d] [STARTING_PROCESS] [%s]", requestId, cmdLine) s := time.Now() err = cmd.Start() @@ -75,7 +75,7 @@ func (d *Driver) StartWithCancel() (*StartedService, error) { d.stopProcess(cmd) return nil, err } - log.Printf("[%d] [PROCESS_STARTED] [%d] [%.2fs]", requestId, cmd.Process.Pid, util.SecondsSince(s)) + log.Printf("[%d] [PROCESS_STARTED] [%d] [%.2fs]", requestId, cmd.Process.Pid, info.SecondsSince(s)) log.Printf("[%d] [PROXY_TO] [%s]", requestId, u.String()) hp := session.HostPort{} if d.Caps.VNC { @@ -93,7 +93,7 @@ func (d *Driver) stopProcess(cmd *exec.Cmd) { return } if stdout, ok := cmd.Stdout.(*os.File); ok && !d.CaptureDriverLogs && d.LogOutputDir != "" { - stdout.Close() + _ = stdout.Close() } - log.Printf("[%d] [TERMINATED_PROCESS] [%d] [%.2fs]", d.RequestId, cmd.Process.Pid, util.SecondsSince(s)) + log.Printf("[%d] [TERMINATED_PROCESS] [%d] [%.2fs]", d.RequestId, cmd.Process.Pid, info.SecondsSince(s)) } diff --git a/service/driver_unix.go b/service/driver_unix.go index 8f95e3d0..edcf0fcd 100644 --- a/service/driver_unix.go +++ b/service/driver_unix.go @@ -10,6 +10,6 @@ import ( func stopProc(cmd *exec.Cmd) error { exitCode := cmd.Process.Signal(syscall.SIGINT) - cmd.Wait() + _ = cmd.Wait() return exitCode } diff --git a/service/driver_windows.go b/service/driver_windows.go index 782bb1ab..3166722b 100644 --- a/service/driver_windows.go +++ b/service/driver_windows.go @@ -9,6 +9,6 @@ import ( func stopProc(cmd *exec.Cmd) error { error := cmd.Process.Kill() - cmd.Wait() + _ = cmd.Wait() return error } diff --git a/service/service.go b/service/service.go index bcb17f3d..79571db7 100644 --- a/service/service.go +++ b/service/service.go @@ -109,7 +109,7 @@ func wait(u string, t time.Duration) error { req.Close = true resp, err := http.DefaultClient.Do(req) if resp != nil { - resp.Body.Close() + _ = resp.Body.Close() } if err != nil { <-time.After(50 * time.Millisecond) diff --git a/service_test.go b/service_test.go index 86012f16..0503d391 100644 --- a/service_test.go +++ b/service_test.go @@ -16,7 +16,6 @@ import ( "github.com/aerokube/selenoid/config" "github.com/aerokube/selenoid/service" "github.com/aerokube/selenoid/session" - "github.com/aerokube/util" "github.com/docker/docker/api/types/container" "github.com/docker/docker/client" assert "github.com/stretchr/testify/require" @@ -60,7 +59,7 @@ func testMux() http.Handler { func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusCreated) output := `{"id": "e90e34656806", "warnings": []}` - w.Write([]byte(output)) + _, _ = w.Write([]byte(output)) }, )) mux.HandleFunc("/v1.29/containers/e90e34656806/start", http.HandlerFunc( @@ -80,9 +79,9 @@ func testMux() http.Handler { w.WriteHeader(http.StatusOK) const streamTypeStderr = 2 header := []byte{streamTypeStderr, 0, 0, 0, 0, 0, 0, 9} - w.Write(header) + _, _ = w.Write(header) data := []byte("test-data") - w.Write(data) + _, _ = w.Write(data) }, )) mux.HandleFunc("/v%s/containers/e90e34656806", http.HandlerFunc( @@ -160,7 +159,7 @@ func testMux() http.Handler { "Mounts": [] } `, p, p, p, p, p, p) - w.Write([]byte(output)) + _, _ = w.Write([]byte(output)) }, )) mux.HandleFunc("/v1.29/networks/net-1/connect", http.HandlerFunc( @@ -310,7 +309,7 @@ func failingMux(numDeleteRequests *int) http.Handler { func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusCreated) output := `{"id": "e90e34656806", "warnings": []}` - w.Write([]byte(output)) + _, _ = w.Write([]byte(output)) }, )) mux.HandleFunc("/v1.29/containers/e90e34656806/start", http.HandlerFunc( @@ -334,7 +333,7 @@ func TestDeleteContainerOnStartupError(t *testing.T) { env := testEnvironment() starter := createDockerStarter(t, env, testConfig(env)) _, err := starter.StartWithCancel() - assert.NoError(t, err) + assert.Error(t, err) assert.Equal(t, numDeleteRequests, 1) } @@ -364,7 +363,7 @@ func TestGetVNC(t *testing.T) { }) defer sessions.Remove("test-session") - u := fmt.Sprintf("ws://%s/vnc/test-session", util.HostPort(srv.URL)) + u := fmt.Sprintf("ws://%s/vnc/test-session", hostPort(srv.URL)) assert.Equal(t, readDataFromWebSocket(t, u), "test-data") } @@ -408,6 +407,6 @@ func TestGetLogs(t *testing.T) { }) defer sessions.Remove("test-session") - u := fmt.Sprintf("ws://%s/logs/test-session", util.HostPort(srv.URL)) + u := fmt.Sprintf("ws://%s/logs/test-session", hostPort(srv.URL)) assert.Equal(t, readDataFromWebSocket(t, u), "test-data") } diff --git a/upload/uploader.go b/upload/uploader.go index 3bbb70b1..4a48ded8 100644 --- a/upload/uploader.go +++ b/upload/uploader.go @@ -1,11 +1,11 @@ package upload import ( + "github.com/aerokube/selenoid/info" "log" "time" "github.com/aerokube/selenoid/event" - "github.com/aerokube/util" ) var ( @@ -39,7 +39,7 @@ func AddUploader(u Uploader) { func (ul *Upload) OnFileCreated(createdFile event.CreatedFile) { if len(ul.uploaders) > 0 { for _, uploader := range ul.uploaders { - go func() { + go func(uploader Uploader) { s := time.Now() uploaded, err := uploader.Upload(createdFile) if err != nil { @@ -47,9 +47,9 @@ func (ul *Upload) OnFileCreated(createdFile event.CreatedFile) { return } if uploaded { - log.Printf("[%d] [UPLOADED_FILE] [%s] [%.2fs]", createdFile.RequestId, createdFile.Name, util.SecondsSince(s)) + log.Printf("[%d] [UPLOADED_FILE] [%s] [%.2fs]", createdFile.RequestId, createdFile.Name, info.SecondsSince(s)) } - }() + }(uploader) } } } diff --git a/utils_test.go b/utils_test.go index 2bafa970..eb0f44ff 100644 --- a/utils_test.go +++ b/utils_test.go @@ -78,7 +78,7 @@ type StartupError struct{} func (m *StartupError) StartWithCancel() (*service.StartedService, error) { log.Println("Starting StartupError Service...") log.Println("Failed to start StartupError Service...") - return nil, errors.New("Failed to start Service") + return nil, errors.New("failed to start Service") } func (m *StartupError) Find(caps session.Caps, requestId uint64) (service.Starter, bool) { @@ -97,7 +97,7 @@ func (r With) Path(p string) string { return fmt.Sprintf("%s%s", r, p) } -func Selenium() http.Handler { +func Selenium(nsp ...func(map[string]interface{})) http.Handler { var lock sync.RWMutex sessions := make(map[string]struct{}) mux := http.NewServeMux() @@ -110,9 +110,13 @@ func Selenium() http.Handler { lock.Lock() sessions[u] = struct{}{} lock.Unlock() - json.NewEncoder(w).Encode(struct { - S string `json:"sessionId"` - }{u}) + ret := map[string]interface{}{ + "sessionId": u, + } + for _, n := range nsp { + n(ret) + } + _ = json.NewEncoder(w).Encode(&ret) }) mux.HandleFunc("/session/", func(w http.ResponseWriter, r *http.Request) { u := strings.Split(r.URL.Path, "/")[2] @@ -127,7 +131,7 @@ func Selenium() http.Handler { out := "this call was relayed by the reverse proxy" // Setting wrong Content-Length leads to abort handler error w.Header().Add("Content-Length", strconv.Itoa(2*len(out))) - fmt.Fprintln(w, out) + _, _ = fmt.Fprintln(w, out) return } d, _ := time.ParseDuration(r.FormValue("timeout")) @@ -141,7 +145,7 @@ func Selenium() http.Handler { }) mux.HandleFunc("/testfile", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - w.Write([]byte("test-data")) + _, _ = w.Write([]byte("test-data")) }) upgrader := websocket.Upgrader{ CheckOrigin: func(_ *http.Request) bool { @@ -179,7 +183,7 @@ func Selenium() http.Handler { } } w.WriteHeader(http.StatusOK) - w.Write([]byte("test-clipboard-value")) + _, _ = w.Write([]byte("test-clipboard-value")) }) return mux } @@ -249,7 +253,7 @@ func TestSumUsedTotalGreaterThanPending(t *testing.T) { req = req.WithContext(ctx) _, err = http.DefaultClient.Do(req) - assert.NoError(t, err) + assert.Error(t, err) assert.Equal(t, queue.Pending(), 0) assert.Equal(t, queue.Used(), 2) } From 61491c4203b33d8fbeb83b3a317d29437654cd2e Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 28 Feb 2024 12:50:43 +0300 Subject: [PATCH 73/83] Added se:cdpVersion to returned capabilities (related to #1405) --- selenoid.go | 8 +++++++- selenoid_test.go | 7 ++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/selenoid.go b/selenoid.go index 96e50843..439e2244 100644 --- a/selenoid.go +++ b/selenoid.go @@ -9,7 +9,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/aerokube/selenoid/info" "io" "log" "net" @@ -24,6 +23,8 @@ import ( "sync" "time" + "github.com/aerokube/selenoid/info" + "github.com/aerokube/selenoid/event" "github.com/aerokube/selenoid/jsonerror" "github.com/aerokube/selenoid/service" @@ -427,6 +428,11 @@ func processBody(input []byte, host string) ([]byte, string, error) { if c, ok := raw.(map[string]interface{}); ok { sessionId = v["sessionId"].(string) c["se:cdp"] = fmt.Sprintf("ws://%s/devtools/%s/", host, sessionId) + if rbv, ok := c["browserVersion"]; ok { + if bv, ok := rbv.(string); ok { + c["se:cdpVersion"] = bv + } + } } } } diff --git a/selenoid_test.go b/selenoid_test.go index ee09ece2..b6f568d0 100644 --- a/selenoid_test.go +++ b/selenoid_test.go @@ -931,7 +931,7 @@ func TestAddedSeCdpCapability(t *testing.T) { fn := func(input map[string]interface{}) { input["value"] = map[string]interface{}{ "sessionId": input["sessionId"], - "capabilities": make(map[string]interface{}), + "capabilities": map[string]interface{}{"browserVersion": "some-version"}, } delete(input, "sessionId") } @@ -958,6 +958,11 @@ func TestAddedSeCdpCapability(t *testing.T) { assert.True(t, ok) capabilities, ok := rc.(map[string]interface{}) assert.True(t, ok) + rcv, ok := capabilities["se:cdpVersion"] + assert.True(t, ok) + cv, ok := rcv.(string) + assert.True(t, ok) + assert.NotEmpty(t, cv) rws, ok := capabilities["se:cdp"] assert.True(t, ok) ws, ok := rws.(string) From 350e6c83f9b221f505e78ed7a931e7e099a908e6 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Wed, 28 Feb 2024 12:51:23 +0300 Subject: [PATCH 74/83] Bump Golang to 1.22 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 02f25e0d..2e57fc2a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.21.6 + go-version: ~1.22.0 - uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f79ca457..f5837807 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.21.6 + go-version: ~1.22.0 - uses: actions/cache@v3 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ed14f0be..d42325b5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.21.6 + go-version: ~1.22.0 - uses: actions/cache@v3 with: From c86258588f3d51b1baed943b273072102545b2c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:02:17 +0000 Subject: [PATCH 75/83] Bump github.com/docker/docker Bumps [github.com/docker/docker](https://github.com/docker/docker) from 25.0.1+incompatible to 25.0.5+incompatible. - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v25.0.1...v25.0.5) --- updated-dependencies: - dependency-name: github.com/docker/docker dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7b9ffd5c..0297820a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.21 require ( github.com/aerokube/ggr v0.0.0-20240109084922-a37629b63e72 github.com/aws/aws-sdk-go v1.50.3 - github.com/docker/docker v25.0.1+incompatible + github.com/docker/docker v25.0.5+incompatible github.com/docker/go-connections v0.5.0 github.com/docker/go-units v0.5.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index fa9563b3..f2cb5c2d 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/docker v25.0.1+incompatible h1:k5TYd5rIVQRSqcTwCID+cyVA0yRg86+Pcrz1ls0/frA= -github.com/docker/docker v25.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= +github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= From ab72a8e29116479648aa1e57ab48730f5eb31dd9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 13:00:57 +0000 Subject: [PATCH 76/83] Bump golang.org/x/net from 0.20.0 to 0.23.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.20.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.20.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 0297820a..27245b84 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/mafredri/cdp v0.34.1 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.8.4 - golang.org/x/net v0.20.0 + golang.org/x/net v0.23.0 ) require ( @@ -40,7 +40,7 @@ require ( go.opentelemetry.io/otel/sdk v1.22.0 // indirect go.opentelemetry.io/otel/trace v1.22.0 // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.17.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index f2cb5c2d..b23bb7fe 100644 --- a/go.sum +++ b/go.sum @@ -126,8 +126,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -141,8 +141,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210319071255-635bc2c9138d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= From b71405f6768a4ebbdd517ddcc623931e58312240 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 20 May 2024 20:38:07 +0300 Subject: [PATCH 77/83] Bump Golang to 1.22.3 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- go.mod | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2e57fc2a..b9e92c44 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.22.0 + go-version: ~1.22.3 - uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f5837807..eed70865 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.22.0 + go-version: ~1.22.3 - uses: actions/cache@v3 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d42325b5..cf4d01ac 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.22.0 + go-version: ~1.22.3 - uses: actions/cache@v3 with: diff --git a/go.mod b/go.mod index 27245b84..a4f5ab8e 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/aerokube/selenoid -go 1.21 +go 1.22 require ( github.com/aerokube/ggr v0.0.0-20240109084922-a37629b63e72 From b66f000a43feb612d512279b7aa296d5a956d08c Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 20 May 2024 20:48:06 +0300 Subject: [PATCH 78/83] Bump Docker client to support API 1.45 (fixes #1420) --- go.mod | 20 +++++++++++--------- go.sum | 47 ++++++++++++++++++++++++----------------------- selenoid.go | 4 ++-- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index a4f5ab8e..bf9c989a 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,18 @@ module github.com/aerokube/selenoid go 1.22 require ( - github.com/aerokube/ggr v0.0.0-20240109084922-a37629b63e72 - github.com/aws/aws-sdk-go v1.50.3 - github.com/docker/docker v25.0.5+incompatible + github.com/aerokube/ggr v0.0.0-20240420103110-fc913c480489 + github.com/aws/aws-sdk-go v1.53.5 + github.com/docker/docker v26.1.3+incompatible github.com/docker/go-connections v0.5.0 github.com/docker/go-units v0.5.0 github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.1 - github.com/imdario/mergo v0.3.13 + github.com/imdario/mergo v0.3.15 github.com/mafredri/cdp v0.34.1 github.com/pkg/errors v0.9.1 - github.com/stretchr/testify v1.8.4 - golang.org/x/net v0.23.0 + github.com/stretchr/testify v1.9.0 + golang.org/x/net v0.25.0 ) require ( @@ -28,6 +28,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/jmespath/go-jmespath v0.4.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/opencontainers/go-digest v1.0.0 // indirect @@ -39,10 +40,11 @@ require ( go.opentelemetry.io/otel/metric v1.22.0 // indirect go.opentelemetry.io/otel/sdk v1.22.0 // indirect go.opentelemetry.io/otel/trace v1.22.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/tools v0.21.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.1 // indirect ) diff --git a/go.sum b/go.sum index b23bb7fe..fdcf9116 100644 --- a/go.sum +++ b/go.sum @@ -2,10 +2,10 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25 github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/aerokube/ggr v0.0.0-20240109084922-a37629b63e72 h1:qEvnGebmcJLlz3fi12Lkm7/Zs/bGRvTZAM2la4jDIJo= -github.com/aerokube/ggr v0.0.0-20240109084922-a37629b63e72/go.mod h1:sUiJLMjwnDBLwD6zVKz1LSgNaDkoc7hx55sMJiTt2bk= -github.com/aws/aws-sdk-go v1.50.3 h1:NnXC/ukOakZbBwQcwAzkAXYEB4SbWboP9TFx9vvhIrE= -github.com/aws/aws-sdk-go v1.50.3/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aerokube/ggr v0.0.0-20240420103110-fc913c480489 h1:o921DQC1wmxmYftt6xpDmoIlEOUqxPh9bLi5uB25Nps= +github.com/aerokube/ggr v0.0.0-20240420103110-fc913c480489/go.mod h1:soFdGlpMBKP88KMnnCranonPRqNw9O0FasvXvaO8IGs= +github.com/aws/aws-sdk-go v1.53.5 h1:1OcVWMjGlwt7EU5OWmmEEXqaYfmX581EK317QJZXItM= +github.com/aws/aws-sdk-go v1.53.5/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -16,8 +16,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.3+incompatible h1:lLCzRbrVZrljpVNobJu1J2FHk8V0s4BawoZippkc+xo= +github.com/docker/docker v26.1.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -57,8 +57,8 @@ github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/ github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= +github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -73,6 +73,8 @@ github.com/mafredri/cdp v0.34.1 h1:EeLNc+6pkDx2hrAm1arIjiofoH0fM5On1uAFzcuUn+o= github.com/mafredri/cdp v0.34.1/go.mod h1:Dbsh7eY/zhQlsddEDWzZGOztv9Jf2gzKq47M7a2P3C4= github.com/mafredri/go-lint v0.0.0-20180911205320-920981dfc79e/go.mod h1:k/zdyxI3q6dup24o8xpYjJKTCf2F7rfxLp6w/efTiWs= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -92,8 +94,8 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -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/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -120,20 +122,20 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -141,13 +143,13 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210319071255-635bc2c9138d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= @@ -156,8 +158,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= +golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -175,7 +177,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= diff --git a/selenoid.go b/selenoid.go index 439e2244..16ce253f 100644 --- a/selenoid.go +++ b/selenoid.go @@ -29,7 +29,7 @@ import ( "github.com/aerokube/selenoid/jsonerror" "github.com/aerokube/selenoid/service" "github.com/aerokube/selenoid/session" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" "github.com/docker/docker/pkg/stdcopy" "github.com/imdario/mergo" "golang.org/x/net/websocket" @@ -771,7 +771,7 @@ func streamLogs(wsconn *websocket.Conn) { sess, ok := sessions.Get(sid) if ok && sess.Container != nil { log.Printf("[%d] [CONTAINER_LOGS] [%s]", requestId, sess.Container.ID) - r, err := cli.ContainerLogs(wsconn.Request().Context(), sess.Container.ID, types.ContainerLogsOptions{ + r, err := cli.ContainerLogs(wsconn.Request().Context(), sess.Container.ID, container.LogsOptions{ ShowStdout: true, ShowStderr: true, Follow: true, From e498f9b9e70301632efd72e6041f393a7c79ad6e Mon Sep 17 00:00:00 2001 From: ZazaKumar Date: Wed, 22 May 2024 16:54:51 +0700 Subject: [PATCH 79/83] VNC RedHat doc --- docs/faq.adoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/faq.adoc b/docs/faq.adoc index a81eab9b..23e8cd8e 100644 --- a/docs/faq.adoc +++ b/docs/faq.adoc @@ -56,6 +56,10 @@ This depends on your tests. We recommend to start with 1 CPU and 1 Gb of memory The only difference between these images - is a running VNC server (`x11vnc`) consuming approximately 20 Megabytes of RAM in idle state which is negligible compared to browser memory consumption. +**VNC is consuming all my container CPU** + +On RedHat-based distributions you should set `LimitNOFILE=1048576` for `containerd.service` + === Features not Working **Selenoid does not start: open config/browsers.json: no such file or directory** From 99d4332bdf0ad0e56f3ed256897add6fca4c2c1d Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Sun, 21 Jul 2024 10:22:58 +0300 Subject: [PATCH 80/83] Bump Golang to 1.22.5 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b9e92c44..31bf403c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.22.3 + go-version: ~1.22.5 - uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index eed70865..7f9797f1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.22.3 + go-version: ~1.22.5 - uses: actions/cache@v3 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cf4d01ac..af68e5ad 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Golang uses: actions/setup-go@v3 with: - go-version: ~1.22.3 + go-version: ~1.22.5 - uses: actions/cache@v3 with: From 9bb9f6d0f7e0bb97737c4d04443c7939ff163f2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jul 2024 10:39:59 +0000 Subject: [PATCH 81/83] Bump github.com/docker/docker Bumps [github.com/docker/docker](https://github.com/docker/docker) from 26.1.3+incompatible to 26.1.4+incompatible. - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v26.1.3...v26.1.4) --- updated-dependencies: - dependency-name: github.com/docker/docker dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bf9c989a..5d39f49c 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22 require ( github.com/aerokube/ggr v0.0.0-20240420103110-fc913c480489 github.com/aws/aws-sdk-go v1.53.5 - github.com/docker/docker v26.1.3+incompatible + github.com/docker/docker v26.1.4+incompatible github.com/docker/go-connections v0.5.0 github.com/docker/go-units v0.5.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index fdcf9116..f38076c2 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/docker v26.1.3+incompatible h1:lLCzRbrVZrljpVNobJu1J2FHk8V0s4BawoZippkc+xo= -github.com/docker/docker v26.1.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.4+incompatible h1:vuTpXDuoga+Z38m1OZHzl7NKisKWaWlhjQk7IDPSLsU= +github.com/docker/docker v26.1.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= From 9ad136ba9135f928b2294fa06224c31abe338557 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 19:09:51 +0000 Subject: [PATCH 82/83] Bump github.com/docker/docker Bumps [github.com/docker/docker](https://github.com/docker/docker) from 26.1.4+incompatible to 26.1.5+incompatible. - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v26.1.4...v26.1.5) --- updated-dependencies: - dependency-name: github.com/docker/docker dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5d39f49c..a22b07d1 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22 require ( github.com/aerokube/ggr v0.0.0-20240420103110-fc913c480489 github.com/aws/aws-sdk-go v1.53.5 - github.com/docker/docker v26.1.4+incompatible + github.com/docker/docker v26.1.5+incompatible github.com/docker/go-connections v0.5.0 github.com/docker/go-units v0.5.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index f38076c2..891c98e4 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/docker v26.1.4+incompatible h1:vuTpXDuoga+Z38m1OZHzl7NKisKWaWlhjQk7IDPSLsU= -github.com/docker/docker v26.1.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.5+incompatible h1:NEAxTwEjxV6VbBMBoGG3zPqbiJosIApZjxlbrG9q3/g= +github.com/docker/docker v26.1.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= From fa2c794dabc519313c832e1678a940a8fa88c667 Mon Sep 17 00:00:00 2001 From: Alexander Andryashin Date: Tue, 17 Dec 2024 15:13:11 +0300 Subject: [PATCH 83/83] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6eff865e..f7727528 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ [![Docker Pulls](https://img.shields.io/docker/pulls/aerokube/selenoid.svg)](https://hub.docker.com/r/aerokube/selenoid) [![StackOverflow Tag](https://img.shields.io/badge/stackoverflow-selenoid-orange.svg?style=flat)](https://stackoverflow.com/questions/tagged/selenoid) +**UNMAINTAINED**. Consider https://aerokube.com/moon/latest as alternative. + Selenoid is a powerful implementation of [Selenium](http://github.com/SeleniumHQ/selenium) hub using [Docker](https://docker.com/) containers to launch browsers. ![Selenoid Animation](docs/img/selenoid-animation.gif)