Skip to content

[🐛 Bug]: Distributor & Router reboots #2655

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Doofus100500 opened this issue Feb 13, 2025 · 10 comments
Open

[🐛 Bug]: Distributor & Router reboots #2655

Doofus100500 opened this issue Feb 13, 2025 · 10 comments

Comments

@Doofus100500
Copy link
Contributor

What happened?

Periodically, the router and distributor reboot with errors. Additionally, during troubleshooting, I discovered that the new config maps for the components are not being connected to them, so I had to add the configurations the old-fashioned way:

  extraEnvironmentVariables:
    - name: SE_SESSION_REQUEST_TIMEOUT
      value: "3600"
    - name: SE_JAVA_OPTS
      value: "-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:MinRAMPercentage=100 -XX:MaxRAMPercentage=100"

Command used to start Selenium Grid with Docker (or Kubernetes)

helm

Relevant log output

distributor:

Feb 12, 2025 @ 12:19:48.091	selenium-grid-selenium-distributor-77bf78d96d-489xx	Shutdown complete	 - 
	Feb 12, 2025 @ 12:19:48.071	selenium-grid-selenium-distributor-77bf78d96d-489xx	INFO: Binding additional locator mechanisms: relative	 - 
	Feb 12, 2025 @ 12:19:48.071	selenium-grid-selenium-distributor-77bf78d96d-489xx	Feb 12, 2025 7:19:48 AM org.openqa.selenium.grid.node.Node <init>	 - 
	Feb 12, 2025 @ 12:19:48.071	selenium-grid-selenium-distributor-77bf78d96d-489xx	2025-02-12 07:19:48,071 WARN stopped: selenium-grid-distributor (terminated by SIGTERM)	 - 
	Feb 12, 2025 @ 12:19:47.884	selenium-grid-selenium-distributor-77bf78d96d-489xx	2025-02-12 07:19:47,884 INFO waiting for selenium-grid-distributor to die	 - 
	Feb 12, 2025 @ 12:19:47.884	selenium-grid-selenium-distributor-77bf78d96d-489xx	Feb 12, 2025 7:19:47 AM org.openqa.selenium.grid.node.Node <init>	 - 
	Feb 12, 2025 @ 12:19:47.884	selenium-grid-selenium-distributor-77bf78d96d-489xx	INFO: Binding additional locator mechanisms: relative	 - 
	Feb 12, 2025 @ 12:19:47.884	selenium-grid-selenium-distributor-77bf78d96d-489xx	2025-02-12 07:19:47,884 WARN received SIGTERM indicating exit request	 - 
	Feb 12, 2025 @ 12:19:47.884	selenium-grid-selenium-distributor-77bf78d96d-489xx	[56411.154s][warning][os,thread] Failed to start the native thread for java.lang.Thread "HttpClient-5193-SelectorManager"	 - 
	Feb 12, 2025 @ 12:19:47.884	selenium-grid-selenium-distributor-77bf78d96d-489xx	[56411.154s][warning][os,thread] Failed to start thread "Unknown thread" - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.	 - 
	Feb 12, 2025 @ 12:19:47.867	selenium-grid-selenium-distributor-77bf78d96d-489xx	Trapped SIGTERM/SIGINT/x so shutting down supervisord...	 - 
	Feb 12, 2025 @ 12:19:47.866	selenium-grid-selenium-distributor-77bf78d96d-489xx	[56411.135s][warning][os,thread] Failed to start the native thread for java.lang.Thread "JdkHttpClient-0-137"	 - 
	Feb 12, 2025 @ 12:19:47.865	selenium-grid-selenium-distributor-77bf78d96d-489xx	[56411.135s][warning][os,thread] Failed to start thread "Unknown thread" - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.	 - 
	Feb 12, 2025 @ 12:19:47.767	selenium-grid-selenium-distributor-77bf78d96d-489xx	[56411.036s][warning][os,thread] Failed to start the native thread for java.lang.Thread "HttpClient-5192-SelectorManager"	 - 
	Feb 12, 2025 @ 12:19:47.766	selenium-grid-selenium-distributor-77bf78d96d-489xx	[56411.036s][warning][os,thread] Failed to start thread "Unknown thread" - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.	 - 
	Feb 12, 2025 @ 12:19:47.766	selenium-grid-selenium-distributor-77bf78d96d-489xx	INFO: Binding additional locator mechanisms: relative	 - 
	Feb 12, 2025 @ 12:19:47.766	selenium-grid-selenium-distributor-77bf78d96d-489xx	Feb 12, 2025 7:19:47 AM org.openqa.selenium.grid.node.Node <init>	 - 
	Feb 12, 2025 @ 12:19:47.154	selenium-grid-selenium-distributor-77bf78d96d-489xx	[56410.424s][warning][os,thread] Failed to start thread "Unknown thread" - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.	 - 
	Feb 12, 2025 @ 12:19:47.154	selenium-grid-selenium-distributor-77bf78d96d-489xx	Feb 12, 2025 7:19:47 AM org.openqa.selenium.grid.node.Node <init>	 - 
	Feb 12, 2025 @ 12:19:47.154	selenium-grid-selenium-distributor-77bf78d96d-489xx	INFO: Binding additional locator mechanisms: relative	 - 
	Feb 12, 2025 @ 12:19:47.154	selenium-grid-selenium-distributor-77bf78d96d-489xx	[56410.424s][warning][os,thread] Failed to start the native thread for java.lang.Thread "HttpClient-5191-SelectorManager"	 - 
	Feb 12, 2025 @ 12:19:46.831	selenium-grid-selenium-distributor-77bf78d96d-489xx	[56410.101s][warning][os,thread] Failed to start the native thread for java.lang.Thread "HttpClient-5190-SelectorManager"	 - 
	Feb 12, 2025 @ 12:19:46.831	selenium-grid-selenium-distributor-77bf78d96d-489xx	[56410.100s][warning][os,thread] Failed to start thread "Unknown thread" - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.

router:

Feb 12, 2025 @ 12:19:57.411	selenium-grid-selenium-router-c77f6f855-h6xt5	Shutdown complete	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: {"traceId": "8a60980420b0414f7ebcca43c0eba44d","eventTime": 1739344797388466379,"eventName": "exception","attributes": {"exception.message": "Unable to execute request for an existing session: java.net.ConnectException","exception.stacktrace": "java.io.UncheckedIOException: java.net.ConnectException\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)\n\tat org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)\n\tat org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)\n\tat java.base\u002fjava.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n\tat java.base\u002fjava.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n\tat java.base\u002fjava.lang.Thread.run(Thread.java:840)\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)\n\t... 8 more\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\t... 3 more\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)\n\tat java.base\u002fjava.security.AccessController.doPrivileged(AccessController.java:569)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)\n\t... 9 more\n","exception.type": "java.io.UncheckedIOException","http.client_ip": "10.219.35.71","http.flavor": 1,"http.handler_class": "org.openqa.selenium.grid.router.HandleSession","http.host": "grid.skbkontur.ru","http.method": "POST","http.request_content_length": "71","http.scheme": "HTTP","http.target": "\u002fsession\u002f3e8ffcdf5db79e6003e10377806872fd\u002felement","http.user_agent": "selenium\u002f4.20.0 (.net windows)","session.id": "3e8ffcdf5db79e6003e10377806872fd"}}	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)
	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
	... 3 more	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)
	at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)
	... 8 more	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12 07:19:57,388 WARN stopped: selenium-grid-router (terminated by SIGTERM)	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$3	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: java.io.UncheckedIOException: java.net.ConnectException
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)
	at org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)
	at org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: Unable to execute request for an existing session: java.net.ConnectException	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.388703997+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.388731237+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.388	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.nio.channels.ClosedChannelException
	at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)
	at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)
	at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)
	... 9 more	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.nio.channels.ClosedChannelException
	at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)
	at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)
	at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)
	... 9 more	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$3	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)
	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
	... 3 more	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.38613472+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12 07:19:57,386 INFO waiting for selenium-grid-router to die	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: {"traceId": "5a339f03c1ef7d945c6d4cae133069e8","eventTime": 1739344797385557542,"eventName": "exception","attributes": {"exception.message": "Unable to execute request for an existing session: java.net.ConnectException","exception.stacktrace": "java.io.UncheckedIOException: java.net.ConnectException\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)\n\tat org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)\n\tat org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)\n\tat java.base\u002fjava.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n\tat java.base\u002fjava.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n\tat java.base\u002fjava.lang.Thread.run(Thread.java:840)\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)\n\t... 8 more\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\t... 3 more\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)\n\tat java.base\u002fjava.security.AccessController.doPrivileged(AccessController.java:569)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)\n\t... 9 more\n","exception.type": "java.io.UncheckedIOException","http.client_ip": "10.219.35.61","http.flavor": 1,"http.handler_class": "org.openqa.selenium.grid.router.HandleSession","http.host": "grid.skbkontur.ru","http.method": "POST","http.request_content_length": "17928","http.scheme": "HTTP","http.target": "\u002fsession\u002f828e1c9a5a478489a41a1e3e699d2469\u002fexecute\u002fsync","http.user_agent": "selenium\u002f4.20.0 (.net windows)","session.id": "828e1c9a5a478489a41a1e3e699d2469"}}	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: Unable to execute request for an existing session: java.net.ConnectException	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.386403775+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)
	at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)
	... 8 more	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: java.io.UncheckedIOException: java.net.ConnectException
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)
	at org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)
	at org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.386372258+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: {"traceId": "4cb4a0363a0ed411f87cb9704f098a10","eventTime": 1739344797385533555,"eventName": "exception","attributes": {"exception.message": "Unable to execute request for an existing session: java.net.ConnectException","exception.stacktrace": "java.io.UncheckedIOException: java.net.ConnectException\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)\n\tat org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)\n\tat org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)\n\tat java.base\u002fjava.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n\tat java.base\u002fjava.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n\tat java.base\u002fjava.lang.Thread.run(Thread.java:840)\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)\n\t... 8 more\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\t... 3 more\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)\n\tat java.base\u002fjava.security.AccessController.doPrivileged(AccessController.java:569)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)\n\t... 9 more\n","exception.type": "java.io.UncheckedIOException","http.client_ip": "10.219.35.61","http.flavor": 1,"http.handler_class": "org.openqa.selenium.grid.router.HandleSession","http.host": "grid.skbkontur.ru","http.method": "POST","http.request_content_length": "90","http.scheme": "HTTP","http.target": "\u002fsession\u002f19623f7c095ddc6b3a34c260259dd768\u002felements","http.user_agent": "selenium\u002f4.20.0 (.net windows)","session.id": "19623f7c095ddc6b3a34c260259dd768"}}	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.386	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$3	 - 
	Feb 12, 2025 @ 12:19:57.385	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)
	at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)
	... 8 more	 - 
	Feb 12, 2025 @ 12:19:57.385	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)
	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
	... 3 more	 - 
	Feb 12, 2025 @ 12:19:57.385	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.385	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12 07:19:57,385 WARN received SIGTERM indicating exit request	 - 
	Feb 12, 2025 @ 12:19:57.385	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: java.io.UncheckedIOException: java.net.ConnectException
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)
	at org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)
	at org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)	 - 
	Feb 12, 2025 @ 12:19:57.385	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.nio.channels.ClosedChannelException
	at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)
	at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)
	at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)
	... 9 more	 - 
	Feb 12, 2025 @ 12:19:57.385	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: Unable to execute request for an existing session: java.net.ConnectException	 - 
	Feb 12, 2025 @ 12:19:57.385	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.385	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.385925696+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.309	selenium-grid-selenium-router-c77f6f855-h6xt5	Trapped SIGTERM/SIGINT/x so shutting down supervisord...	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)
	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
	... 3 more	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)
	at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)
	... 8 more	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: {"traceId": "71282419a2c6cd32e0b8d84745242507","eventTime": 1739344797280467324,"eventName": "exception","attributes": {"exception.message": "Unable to execute request for an existing session: java.net.ConnectException","exception.stacktrace": "java.io.UncheckedIOException: java.net.ConnectException\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)\n\tat org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)\n\tat org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)\n\tat java.base\u002fjava.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n\tat java.base\u002fjava.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n\tat java.base\u002fjava.lang.Thread.run(Thread.java:840)\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)\n\t... 8 more\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\t... 3 more\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)\n\tat java.base\u002fjava.security.AccessController.doPrivileged(AccessController.java:569)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)\n\t... 9 more\n","exception.type": "java.io.UncheckedIOException","http.client_ip": "10.219.35.61","http.flavor": 1,"http.handler_class": "org.openqa.selenium.grid.router.HandleSession","http.host": "grid.skbkontur.ru","http.method": "POST","http.request_content_length": "2","http.scheme": "HTTP","http.target": "\u002fsession\u002fc14de71b0a8c376b13b7c6c2767f8de1\u002felement\u002ff.21851F19CFEF120B0B9C32016BED5D40.d.436428C93E3668FFB3053811D659ABF2.e.4134\u002fclick","http.user_agent": "selenium\u002f4.20.0 (.net windows)","session.id": "c14de71b0a8c376b13b7c6c2767f8de1"}}	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.280852845+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.280877632+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.nio.channels.ClosedChannelException
	at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)
	at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)
	at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)
	... 9 more	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: java.io.UncheckedIOException: java.net.ConnectException
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)
	at org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)
	at org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: Unable to execute request for an existing session: java.net.ConnectException	 - 
	Feb 12, 2025 @ 12:19:57.280	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$3	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.279488051+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: java.io.UncheckedIOException: java.net.ConnectException
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)
	at org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)
	at org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.nio.channels.ClosedChannelException
	at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)
	at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)
	at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)
	... 9 more	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)
	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
	... 3 more	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: {"traceId": "551938009185f6ad84b9b8c12e1f8444","eventTime": 1739344797279200327,"eventName": "exception","attributes": {"exception.message": "Unable to execute request for an existing session: java.net.ConnectException","exception.stacktrace": "java.io.UncheckedIOException: java.net.ConnectException\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)\n\tat org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)\n\tat org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)\n\tat java.base\u002fjava.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n\tat java.base\u002fjava.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n\tat java.base\u002fjava.lang.Thread.run(Thread.java:840)\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)\n\t... 8 more\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\t... 3 more\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)\n\tat java.base\u002fjava.security.AccessController.doPrivileged(AccessController.java:569)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)\n\t... 9 more\n","exception.type": "java.io.UncheckedIOException","http.client_ip": "10.219.35.71","http.flavor": 1,"http.handler_class": "org.openqa.selenium.grid.router.HandleSession","http.host": "grid.skbkontur.ru","http.method": "POST","http.request_content_length": "71","http.scheme": "HTTP","http.target": "\u002fsession\u002f3e8ffcdf5db79e6003e10377806872fd\u002felement","http.user_agent": "selenium\u002f4.20.0 (.net windows)","session.id": "3e8ffcdf5db79e6003e10377806872fd"}}	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.279566299+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: Unable to execute request for an existing session: java.net.ConnectException	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$3	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.279	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)
	at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)
	... 8 more	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: Unable to execute request for an existing session: java.net.ConnectException	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)
	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
	... 3 more	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.275924228+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$3	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: java.io.UncheckedIOException: java.net.ConnectException
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)
	at org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)
	at org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	2025-02-12T10:19:57.275994714+03:00 stdout F 	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.nio.channels.ClosedChannelException
	at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)
	at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)
	at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
	at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)
	... 9 more	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	Caused by: java.net.ConnectException
	at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)
	at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)
	at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)
	... 8 more	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	Feb 12, 2025 7:19:57 AM org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter$1 lambda$export$1	 - 
	Feb 12, 2025 @ 12:19:57.275	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: {"traceId": "980602c1bd178c4e7800f152bbb335a8","eventTime": 1739344797275275762,"eventName": "exception","attributes": {"exception.message": "Unable to execute request for an existing session: java.net.ConnectException","exception.stacktrace": "java.io.UncheckedIOException: java.net.ConnectException\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:497)\n\tat org.openqa.selenium.remote.http.AddSeleniumUserAgent.lambda$apply$0(AddSeleniumUserAgent.java:42)\n\tat org.openqa.selenium.remote.http.Filter.lambda$andFinally$1(Filter.java:55)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.lambda$executeAsync$1(JdkHttpClient.java:384)\n\tat java.base\u002fjava.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n\tat java.base\u002fjava.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n\tat java.base\u002fjava.lang.Thread.run(Thread.java:840)\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:574)\n\tat java.net.http\u002fjdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)\n\tat org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute0(JdkHttpClient.java:456)\n\t... 8 more\nCaused by: java.net.ConnectException\n\tat java.net.http\u002fjdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base\u002fjava.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\t... 3 more\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)\n\tat java.base\u002fsun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)\n\tat java.base\u002fjava.security.AccessController.doPrivileged(AccessController.java:569)\n\tat java.net.http\u002fjdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)\n\t... 9 more\n","exception.type": "java.io.UncheckedIOException","http.client_ip": "10.219.35.61","http.flavor": 1,"http.handler_class": "org.openqa.selenium.grid.router.HandleSession","http.host": "grid.skbkontur.ru","http.method": "POST","http.request_content_length": "17928","http.scheme": "HTTP","http.target": "\u002fsession\u002f828e1c9a5a478489a41a1e3e699d2469\u002fexecute\u002fsync","http.user_agent": "selenium\u002f4.20.0 (.net windows)","session.id": "828e1c9a5a478489a41a1e3e699d2469"}}	 - 
	Feb 12, 2025 @ 12:19:57.269	selenium-grid-selenium-router-c77f6f855-h6xt5	WARNING: Unable to execute request for an existing session: java.net.ConnectException

Operating System

k8s

Docker Selenium version (image tag)

4.28.1-20250202

Selenium Grid chart version (chart version)

0.39.2

Copy link

@Doofus100500, thank you for creating this issue. We will troubleshoot it as soon as we can.


Info for maintainers

Triage this issue by using labels.

If information is missing, add a helpful comment and then I-issue-template label.

If the issue is a question, add the I-question label.

If the issue is valid but there is no time to troubleshoot it, consider adding the help wanted label.

If the issue requires changes or fixes from an external project (e.g., ChromeDriver, GeckoDriver, MSEdgeDriver, W3C), add the applicable G-* label, and it will provide the correct link and auto-close the issue.

After troubleshooting the issue, please add the R-awaiting answer label.

Thank you!

@Doofus100500
Copy link
Contributor Author


Feb 13, 2025 @ 13:40:48.435 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | Liveness probe failed:
-- | -- | -- | -- | --

  | Feb 13, 2025 @ 13:35:46.089 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | (combined from similar events): Liveness probe errored: rpc error: code = Unknown desc = failed to exec in container: failed to start exec "7f28d610cfe6cfe5168a7b972f723bc450f8a502c08706cee66601c911484aeb": OCI runtime exec failed: exec failed: unable to start container process: read init-p: connection reset by peer: unknown

  | Feb 13, 2025 @ 13:30:46.089 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | Liveness probe errored: rpc error: code = Unknown desc = failed to exec in container: failed to start exec "5aaade03c480f78355b28278cafca6cbe3ed29118a35e306308affd95354286c": OCI runtime exec failed: exec failed: unable to start container process: read init-p: connection reset by peer: unknown

  | Feb 13, 2025 @ 13:30:06.198 | Unhealthy | Warning | selenium-grid-selenium-router-5db9bd694d-n6scd | Readiness probe failed: Get "https://10.223.105.160:4444/readyz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

  | Feb 13, 2025 @ 13:29:46.085 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | Liveness probe errored: rpc error: code = Unknown desc = failed to exec in container: failed to start exec "0447ca94f773c4470c602e5970eca2f55dfefc473a0dc1a9845a083073d47078": OCI runtime exec failed: exec failed: unable to start container process: read init-p: connection reset by peer: unknown

  | Feb 13, 2025 @ 13:29:25.400 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | Readiness probe failed: Get "https://10.223.81.17:5553/readyz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

  | Feb 13, 2025 @ 13:28:46.084 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | Liveness probe errored: rpc error: code = Unknown desc = failed to exec in container: failed to start exec "a896b97b04aaf79a5a7450db8cbee0f7afd7366d8f90a8fa1a3498586e60c331": OCI runtime exec failed: exec failed: unable to start container process: read init-p: connection reset by peer: unknown

  | Feb 13, 2025 @ 13:27:55.845 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | Readiness probe failed: Get "https://10.223.81.17:5553/readyz": net/http: request canceled (Client.Timeout exceeded while awaiting headers)

  | Feb 13, 2025 @ 13:27:49.227 | Unhealthy | Warning | selenium-grid-selenium-router-5db9bd694d-n6scd | Liveness probe failed:

  | Feb 13, 2025 @ 13:27:46.575 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | Liveness probe errored: rpc error: code = Unknown desc = failed to exec in container: failed to start exec "0239983d7aea17ee84cc60ebf161f4894a15f6882e3678530eb0f563e18b94ab": OCI runtime exec failed: exec failed: unable to start container process: read init-p: connection reset by peer: unknown

  | Feb 13, 2025 @ 13:27:46.198 | Unhealthy | Warning | selenium-grid-selenium-router-5db9bd694d-n6scd | Readiness probe failed: Get "https://10.223.105.160:4444/readyz": net/http: request canceled (Client.Timeout exceeded while awaiting headers)

  | Feb 13, 2025 @ 13:27:26.201 | Unhealthy | Warning | selenium-grid-selenium-router-5db9bd694d-n6scd | Readiness probe failed: HTTP probe failed with statuscode: 503

  | Feb 13, 2025 @ 13:27:25.404 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | Readiness probe failed: HTTP probe failed with statuscode: 500

  | Feb 13, 2025 @ 13:25:46.083 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | Liveness probe errored: rpc error: code = Unknown desc = failed to exec in container: failed to start exec "8667972d797d0425bfc699508e8a185598bd5bcf43edf67a4c82ca7c868da72f": OCI runtime exec failed: exec failed: unable to start container process: read init-p: connection reset by peer: unknown

  | Feb 13, 2025 @ 12:28:49.268 | Unhealthy | Warning | selenium-grid-selenium-router-5db9bd694d-n6scd | Liveness probe failed:

  | Feb 13, 2025 @ 12:28:48.667 | Unhealthy | Warning | selenium-grid-selenium-distributor-77d77b4f9c-lfx7w | Liveness probe failed:


@Doofus100500
Copy link
Contributor Author

On the nodes, we are also catching OpenQA.Selenium.WebDriverException: java.net.ConnectException.

@Doofus100500
Copy link
Contributor Author

Rolled back to the chart with version 0.38.5, but the issue is still present.

Liveness probe errored: rpc error: code = Unknown desc = failed to exec in container: failed to start exec "636331cba7b6cfa22506d8a83db3fed3ccd88688dc3654aaf042cd4a1a97b9dc": OCI runtime exec failed: exec failed: unable to start container process: read init-p: connection reset by peer: unknown

@VietND96
Copy link
Member

new config maps for the components are not being connected to them

On this issue, can you share your values file? I will use it to check the template render.

@Doofus100500
Copy link
Contributor Author

Yes, no problem:

global:
  # -- Public IP of the host running Kubernetes cluster.
  # This is used to access the Selenium Grid from outside the cluster when ingress is disabled or enabled without a hostname is set.
  # This is part of constructing SE_NODE_GRID_URL and rewrite URL of `se:vnc`, `se:cdp` in the capabilities when `ingress.hostname` is unset
  K8S_PUBLIC_IP: ""
  seleniumGrid:
    # -- Image registry for all selenium components
    imageRegistry: docker-proxy.host/selenium
    # -- Image tag for all selenium components
    imageTag: 4.27.0-20241204
    # -- Image tag for browser's nodes
    nodesImageTag: 4.27.0-20241204
    # -- Image tag for browser's video recorder
    videoImageTag: &videoImageTag "ffmpeg-7.1-20241204"
    # -- kubectl image is used to execute kubectl commands in utility jobs
    kubectlImage: bitnami/kubectl:latest
    # -- Pull secret for all components, can be overridden individually
    imagePullSecret: ""
    # -- Log level for all components. Possible values describe here: https://www.selenium.dev/documentation/grid/configuration/cli_options/#logging
    logLevel: INFO
    # -- Set default startup probe method for all nodes (supplied values: httpGet, exec). If not set, the default is httpGet
    defaultNodeStartupProbe: httpGet
    # -- Set default readiness probe method for all nodes (supplied values: httpGet, exec). If not set, the default is httpGet
    defaultNodeLivenessProbe: exec
    # -- Set default liveness probe method for all nodes (supplied values: httpGet, exec). If not set, the default is httpGet
    defaultComponentLivenessProbe: exec
    # -- Probe logs output can be retrieved using `kubectl logs`. Noted: this will not work if shareProcessNamespace is enabled
    stdoutProbeLog: true
    # -- Specify how many old ReplicaSets for this Deployment you want to retain. The rest will be garbage-collected in the background.
    revisionHistoryLimit: 10
    # -- Whether to enable structured logging
    structuredLogs: true
    # -- Enable http logging. Tracing should be enabled to log http logs.
    httpLogs: false
    updateStrategy:
      # -- Specify update strategy for all components, can be overridden individually
      type: RollingUpdate
      # type: RollingUpdate
      # -- Specify for strategy RollingUpdate
      rollingUpdate:
        maxSurge: 1
        maxUnavailable: 0
    # -- Specify affinity for all components, can be overridden individually
    affinity: {}
    # -- Specify topologySpreadConstraints for all components, can be overridden individually
    topologySpreadConstraints: []
    #  - maxSkew: 4
    #    topologyKey: kubernetes.io/hostname
    #    whenUnsatisfiable: DoNotSchedule
    #    Note: If not define labelSelector, it will be added automatically based on "app" label in each component
    # -- Specify number of max sessions per node. Can be overridden by individual component (this is also set to scaler trigger parameter `nodeMaxSessions` if `autoscaling` is enabled)
    nodeMaxSessions: 1

tls:
  # -- Create a Secret resource for TLS certificate and key. If using an external secret set to false and provide its name in `nameOverride` below
  create: true
  # -- Name of external secret containing the TLS certificate and key
  # nameOverride:
  # -- Enable or disable TLS for the server components (and ingress proxy)
  enabled: true
  ingress:
    # -- Enable or disable TLS for the ingress proxy only
    enabled: true
    # -- Use the certificate and key are generated with below settings
    generateTLS: false
    defaultName: "SeleniumHQ"
    defaultDays: 3650
    defaultCN: "www.selenium.dev"
    # or *.domain.com
    defaultSANList: []
    #  - staging.domain.com
    #  - production.domain.com
    defaultIPList: []
    #  - 10.10.10.10
  # -- Cert files will be imported from chart directory if not specified
  secretFilesImportFrom: "certs/**"
  # -- File names for the TLS certificate and key to import
  # secretFiles:
  #   # -- Key to set contents for certificate file via --set-file
  #   tls.crt: ""
  #   # -- Key to set contents for private key file via --set-file
  #   tls.key: ""
  #   # -- Key to set contents for trust store file via --set-file
  #   server.jks: ""
  #   # -- Key to set contents for trust store password file via --set-file
  #   server.pass: ""
  # -- All files for TLS will be mounted to the server components under directory
  certVolumeMountPath: "/opt/selenium/secrets"
  # -- Cert file will be mounted to server components as a volume
  certificateFile: tls.crt
  # -- Key file will be mounted to server components as a volume
  privateKeyFile: tls.key
  # -- Trust store file will be mounted to server components as a volume
  trustStoreFile: server.jks
  # -- Trust store password file will be mounted to server components as a volume
  trustStorePasswordFile: server.pass
  # -- Recommend to get from trustStorePasswordFile instead of plain text via env variable
  trustStorePassword: ""
  # -- Disable verification the hostname included in the server's TLS/SSL certificates matches the hostnames provided
  disableHostnameVerification: true

registrationSecret:
  # -- Enable feature node registration secret to make sure that the node is one you control and not a rouge node
  enabled: true
  # -- The secret value to be used for node registration
  value: "$SELENIUM_REGISTRATION_SECRET"

# Basic auth settings for Selenium Grid
basicAuth:
  # -- Create a secret resource for basic auth. If using an external secret, set to false and provide its name in `nameOverride` below
  create: true
  # -- External secret containing the basic auth username and password for reference
  # nameOverride:
  # -- Enable or disable basic auth for the Hub/Router
  enabled: $BASIC_AUTH
  # -- Username for basic auth
  username: $BASIC_AUTH_USERNAME
  # -- Password for basic auth
  password: $BASIC_AUTH_PASSWORD
  # -- Embed the basic auth "username:password@" in few URLs e.g. SE_NODE_GRID_URL
  embeddedUrl: true
  # -- Annotations for basic auth secret resource
  annotations: {}

# -- Deploy Router, Distributor, EventBus, SessionMap and Nodes separately
isolateComponents: true

# Service Account for all components
serviceAccount:
  # -- Create a service account for all components. If using an external service account, set to false and provide its name in `nameOverride` below
  create: false
  # -- Override to use an external service account
  nameOverride: "$KUBERNETES_NAMESPACE-sa"
  # -- Annotations for the service account
  annotations: {}
  #  eks.amazonaws.com/role-arn: "arn:aws:iam::12345678:role/video-bucket-permissions"

# -- RBAC settings for patching finalizers KEDA scaled resources
rbacRole:
  # -- Enable to create RBAC role to access few KEDA resources. If using an external role, set to false and provide its name in `nameOverride` below
  create: false
  # -- Override resource name or provide an external role name
  # nameOverride:
  annotations: {}
  rules:
    - apiGroups:
        - keda.sh
      resources:
        - scaledjobs
      verbs: [get, list, patch, update, delete]
    - apiGroups:
        - keda.sh
      resources:
        - scaledobjects
      verbs: [get, list, patch, update, delete]
    - apiGroups:
        - keda.sh
      resources:
        - triggerauthentications
      verbs: [get, list, patch, update, delete]
    - apiGroups:
        - autoscaling
      resources:
        - horizontalpodautoscalers
      verbs: [get, list, patch, update, delete]

# -- RBAC role binding settings for patching finalizers KEDA scaled resources
rbacRoleBinding:
  # -- Enable to create RBAC role binding to a service account. If using an external role binding, set to false and provide its name in `nameOverride` below
  create: false
  # -- Override resource name or provide an external role binding name
  # nameOverride:
  annotations: {}
  subjects:
    - kind: ServiceAccount
  roleRef:
    kind: Role
    apiGroup: rbac.authorization.k8s.io

# Configure the ingress resource to access the Grid installation.
ingress:
  # -- Enable to create ingress resource
  enabled: true
  # -- Enable ingress resource with automatically installing Ingress NGINX Controller
  enableWithController: false
  # -- Name of ingress class to select which controller will implement ingress resource
  className: "nginx"
  # Refer to list nginx annotations: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md#annotations
  nginx:
    # -- Enable corresponding annotations for NGINX Ingress Controller
    websocket: true
    # -- Set timeout to corresponding annotations for NGINX Ingress Controller
    proxyTimeout: 3600
    proxyBuffer:
      # -- Set buffer size to corresponding annotations for NGINX Ingress Controller
      size: 512M
    # -- Set buffer number to corresponding annotations for NGINX Ingress Controller
      number: 4
    # -- Enable corresponding annotations for NGINX Ingress Controller
    sslPassthrough: true
    # -- Specify a Secret with the certificate `tls.crt`, key `tls.key`, the name in the form "namespace/secretName" for NGINX Ingress Controller
    # sslSecret: ""
    # -- Enables or disables HTTP/2 support in secure connections via annotations for NGINX Ingress Controller
    useHttp2: true
    # -- Apply upstream keepalive settings once HTTP/2 is enabled
    upstreamKeepalive:
      # -- Set keepalive connections to corresponding annotations for NGINX Ingress Controller
      connections: 10000
      # -- Set keepalive timeout to corresponding annotations for NGINX Ingress Controller
      time: 1h
      # -- Set keepalive requests to corresponding annotations for NGINX Ingress Controller
      requests: 10000
  ports:
    # -- Specify HTTP port is exposed by ingress controller
    http: 80
    # -- Specify HTTPS port is exposed by ingress controller
    https: 443
  # -- Custom annotations for ingress resource
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
  # -- Default host for the ingress resource
  hostname: $SELENIUM_GRID_HOST
  # -- Default host path for the ingress resource
  path: $INGRESS_AND_SUB_PATH
  # -- Default path type for the ingress resource
  pathType: Prefix
  # -- List of paths for the ingress resource. This will override the default path
  paths:
    - path: $INGRESS_AND_SUB_PATH
      pathType: Prefix
      backend:
        service:
          name: selenium-grid-selenium-router
          port:
            number: 4444
    - path: $INGRESS_AND_SUB_PATH/ui/
      pathType: Prefix
      backend:
        service:
          name: selenium-grid-selenium-router
          port:
            number: 4444

  # -- TLS backend configuration for ingress resource
  tls: []

# ConfigMap that contains SE_EVENT_BUS_HOST, SE_EVENT_BUS_PUBLISH_PORT and SE_EVENT_BUS_SUBSCRIBE_PORT variables
busConfigMap:
  # -- Override the name of the bus configMap
  # nameOverride:
  # -- Override or add extra data to the ConfigMap. The property that appears last within the ConfigMap overwrites any preceding values
  data:
    SE_JAVA_OPTS: "-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:MaxRAMPercentage=100"
  # -- Custom annotations for configmap
  annotations: {}

# ConfigMap that contains environment variables for session map
sessionMapConfigMap:
  # -- Override the name of the session map configMap
  # nameOverride:
  # -- Override or add extra data to the ConfigMap. The property that appears last within the ConfigMap overwrites any preceding values
  data:
    SE_JAVA_OPTS: "-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:MaxRAMPercentage=100"
  # -- Custom annotations for configmap
  annotations: {}

# ConfigMap that contains environment variables for session queue
sessionQueueConfigMap:
  # -- Override the name of the session map configMap
  # nameOverride:
  # -- Override or add extra data to the ConfigMap. The property that appears last within the ConfigMap overwrites any preceding values
  data:
    SE_JAVA_OPTS: "-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:MaxRAMPercentage=100"
  # -- Custom annotations for configmap
  annotations: {}

distributorConfigMap:
  # -- Override the name of the distributor configMap
  # nameOverride:
  # -- Override or add extra data to the ConfigMap. The property that appears last within the ConfigMap overwrites any preceding values
  data:
    SE_JAVA_OPTS: "-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:MaxRAMPercentage=100"
  # -- Default mode for ConfigMap is mounted as file
  defaultMode: 0755
  # -- Directory where the extra scripts are imported to ConfigMap by default (if given a relative path, it should be in chart's directory)
  extraScriptsImportFrom: "configs/distributor/**"
  # -- Directory where the extra scripts are mounted to
  extraScriptsDirectory: "/opt/bin"
  # extraScripts:
    # -- Key to set contents for script file via --set-file
  #   distributorProbe.sh: ""
  # -- Name of volume mount is used to mount scripts in the ConfigMap. Default is same as this configMap name
  scriptVolumeMountName:
  # -- Custom annotations for configmap
  annotations: {}

routerConfigMap:
  # -- Override the name of the router configMap
  # nameOverride:
  # -- Override or add extra data to the ConfigMap. The property that appears last within the ConfigMap overwrites any preceding values
  data:
    SE_JAVA_OPTS: "-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:MaxRAMPercentage=100"
  # -- Default mode for ConfigMap is mounted as file
  defaultMode: 0755
  # -- Directory where the extra scripts are imported to ConfigMap by default (if given a relative path, it should be in chart's directory)
  extraScriptsImportFrom: "configs/router/**"
  # -- Directory where the extra scripts are mounted to
  extraScriptsDirectory: "/opt/bin"
  # extraScripts:
    # -- Key to set contents for script file via --set-file
    # routerGraphQLUrl.sh: ""
    # -- Key to set contents for script file via --set-file
    # routerProbe.sh: ""
  # -- Name of volume mount is used to mount scripts in the ConfigMap
  scriptVolumeMountName:
  # -- Custom annotations for configmap
  annotations: {}

# ConfigMap that contains common environment variables for browser nodes
nodeConfigMap:
  # -- Override the name of the node configMap
  # nameOverride:
  # -- Override or add extra data to the ConfigMap. The property that appears last within the ConfigMap overwrites any preceding values
  data:
    SE_JAVA_OPTS: "-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:MaxRAMPercentage=50"
  # -- Default mode for ConfigMap is mounted as file
  defaultMode: 0755
  # -- Directory where the extra scripts are imported to ConfigMap by default (if given a relative path, it should be in chart's directory)
  extraScriptsImportFrom: "configs/node/**"
  # -- Directory where the extra scripts are mounted to
  extraScriptsDirectory: "/opt/bin"
  # extraScripts:
    # -- Key to set contents for script file via --set-file
    # nodeGridUrl.sh: ""
    # -- Key to set contents for script file via --set-file
    # nodePreStop.sh: ""
    # -- Key to set contents for script file via --set-file
    # nodeProbe.sh: ""
  # -- Name of volume mount is used to mount scripts in the ConfigMap
  scriptVolumeMountName:
  leftoversCleanup:
    # -- Enable feature automatic browser leftovers cleanup stuck browser processes, tmp files
    enabled: false
    # -- Interval in seconds to run the cleanup job
    jobIntervalInSecs: 3600
    # -- Browser process elapsed time in seconds to consider as leftovers
    browserElapsedTimeInSecs: 7200
    # -- Tmp files elapsed time in days to consider as leftovers
    tmpFilesAfterDays: 1
  # -- Custom annotations for configmap
  annotations: {}

recorderConfigMap:
  # -- Override the name of the recorder configMap
  # nameOverride:
  # -- Default mode for ConfigMap is mounted as file
  defaultMode: 0755
  # -- Directory where the extra scripts are imported to ConfigMap by default (if given a relative path, it should be in chart's directory)
  extraScriptsImportFrom: "configs/recorder/**"
  # -- Directory where the extra scripts are mounted to
  extraScriptsDirectory: "/opt/bin"
  # -- List of extra scripts to be mounted to the container. Format as `filename: content`
  # extraScripts:
  #  video.sh: ""
  #  video_graphQLQuery.sh: ""
  # -- Name of volume mount is used to mount scripts in the ConfigMap
  # scriptVolumeMountName:
  # -- Directory in container where the videos are stored
  videoVolumeMountName: videos
  # -- Custom annotations for configmap
  annotations: {}

uploaderConfigMap:
  # -- Override the name of the uploader configMap
  # nameOverride:
  # -- Default mode for ConfigMap is mounted as file
  defaultMode: 0755
  # -- Directory where the extra scripts are imported to ConfigMap by default (if given a relative path, it should be in chart's directory)
  extraScriptsImportFrom: "configs/uploader/**"
  # -- Directory where the extra scripts are mounted to
  extraScriptsDirectory: "/opt/bin"
  # -- List of extra scripts to be mounted to the container. Format as `filename: content`
  # extraScripts:
  #   upload.sh: ""
  # -- Extra files stored in Secret to be mounted to the container.
  # secretFiles:
  #   upload.conf: "[sample]"
  # -- Name of volume mount is used to mount scripts in the ConfigMap
  # scriptVolumeMountName:
  # -- Name of Secret is used to store the `secretFiles`
  # secretVolumeMountName:
  # -- Custom annotations for configmap
  annotations: {}

# -- ConfigMap that contains common environment variables for Logging (https://www.selenium.dev/documentation/grid/configuration/cli_options/#logging)
loggingConfigMap:
  # -- Override the name of the logging configMap
  # nameOverride:
  # -- Override or add extra data to the ConfigMap. The property that appears last within the ConfigMap overwrites any preceding values
  data: {}
  # -- Custom annotations for configmap
  annotations: {}

serverConfigMap:
  # -- Override the name of the server configMap
  # nameOverride:
  # -- Extra common environment variables for Server (https://www.selenium.dev/documentation/grid/configuration/cli_options/#server) to server configMap
  data:
    # Log level of supervisord. Accept values: critical, error, warn, info, debug, trace, blather (http://supervisord.org/logging.html)
    SE_SUPERVISORD_LOG_LEVEL: "info"
    SE_FF_MPEG_IMAGE: *videoImageTag
    SE_NAMESPACE: "$KUBERNETES_NAMESPACE"
  # -- Custom annotations for configmap
  annotations: {}

# Secrets for all components. Component environment variables contain sensitive data should be stored in secrets.
secrets:
  # -- Create the default secret for all components. If using an external secret, set to false and provide its name in `nameOverride` below
  create: true
  # -- Override to use an external secret
  # nameOverride:
  # -- Extra environment variables set to the secret
  data:
    SE_VNC_PASSWORD: "secret"
  # -- Custom annotations for secret
  annotations: {}

# Configuration for isolated components (applied only if `isolateComponents: true`)
components:
  # Configuration for router component
  router:
    # -- Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter)
    # imageRegistry:
    # -- Router image name
    imageName: router
    # -- Router image tag (this overwrites global.seleniumGrid.imageTag parameter)
    # imageTag:

    # -- Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images)
    imagePullPolicy: IfNotPresent
    # -- Image pull secret (see https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
    # imagePullSecret: ""

    # -- Custom sub path for Router
    subPath: "$INGRESS_AND_SUB_PATH"
    # -- Disable the Grid UI
    disableUI: false
    # -- Specify extra environment variables for Router
    extraEnvironmentVariables: []
    # -- Specify extra environment variables from ConfigMap and Secret for Router
    extraEnvFrom: []
    # -- Specify affinity for router pods, this overwrites global.seleniumGrid.affinity parameter
    affinity: {}
    # -- Specify topologySpreadConstraints for router pods, this overwrites global.seleniumGrid.topologySpreadConstraints parameter
    topologySpreadConstraints: []
    # -- Custom annotations for router pods
    annotations: {}
    # -- Router container port
    port: 4444
    # -- Router expose NodePort
    nodePort: $NODE_PORT_ROUTER
    # -- Startup probe settings
    startupProbe:
      enabled: true
      path: /readyz
      initialDelaySeconds: 5
      failureThreshold: 10
      timeoutSeconds: 10
      periodSeconds: 10
      successThreshold: 1
    # -- Readiness probe settings
    readinessProbe:
      enabled: true
      path: /readyz
      initialDelaySeconds: 12
      failureThreshold: 10
      timeoutSeconds: 10
      periodSeconds: 10
      successThreshold: 1
    # -- Liveness probe settings
    livenessProbe:
      enabled: true
      path: /readyz
      initialDelaySeconds: 60
      failureThreshold: 30
      timeoutSeconds: 60
      periodSeconds: 60
      successThreshold: 1
    # -- Resources for router container
    resources:
      requests:
        cpu: $ROUTER_CPU_REQUESTS
        ephemeral-storage: $ROUTER_EPHEMERAL_STORAGE_REQUESTS
        memory: $ROUTER_MEMORY_REQUESTS
      limits:
        cpu: $ROUTER_CPU_LIMIT
        ephemeral-storage: $ROUTER_EPHEMERAL_STORAGE_LIMIT
        memory: $ROUTER_MEMORY_LIMIT
    # -- SecurityContext for router container
    securityContext: {}
    # -- Kubernetes service type (see https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types)
    serviceType: NodePort
    # -- Set specific clusterIP when serviceType is ClusterIP (see https://kubernetes.io/docs/concepts/services-networking/service/#type-clusterip)
    # clusterIP: ""
    # -- Set specific externalName when serviceType is ExternalName (see https://kubernetes.io/docs/concepts/services-networking/service/#type-externalname)
    # externalName: ""
    # -- Set specific loadBalancerIP when serviceType is LoadBalancer (see https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer)
    # loadBalancerIP: ""
    # -- Custom annotations for router service
    serviceAnnotations: {}
    # -- Set externalTrafficPolicy to Local or Cluster (see https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
    # serviceExternalTrafficPolicy: ""
    # -- Set session affinity to None, ClientIP or ClientIPString
    # serviceSessionAffinity: ""
    # -- Tolerations for router pods
    tolerations: []
    # -- Node selector for router pods
    nodeSelector: {}
    # -- Priority class name for router pods
    priorityClassName: "high"

  # Configuration for distributor component
  distributor:
    # -- Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter)
    # imageRegistry:
    # -- Distributor image name
    imageName: distributor
    # -- Distributor image tag (this overwrites global.seleniumGrid.imageTag parameter)
    # imageTag:

    # -- Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images)
    imagePullPolicy: IfNotPresent
    # -- Image pull secret (see https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
    # imagePullSecret: ""

    # -- Configure fixed-sized thread pool for the Distributor to create new sessions as it consumes new session requests from the queue
    newSessionThreadPoolSize: 5000
    # -- Specify extra environment variables for Distributor
    extraEnvironmentVariables: []
    # -- Specify extra environment variables from ConfigMap and Secret for Distributor
    extraEnvFrom: []
    # -- Specify affinity for distributor pods, this overwrites global.seleniumGrid.affinity parameter
    affinity: {}
    # -- Specify topologySpreadConstraints for Distributor pods, this overwrites global.seleniumGrid.topologySpreadConstraints parameter
    topologySpreadConstraints: []
    # -- Custom annotations for Distributor pods
    annotations: {}
    # -- Distributor container port
    port: 5553
    # -- Distributor expose NodePort
    nodePort: 30553
    # -- Startup probe settings
    startupProbe:
      enabled: true
      path: /readyz
      initialDelaySeconds: 5
      failureThreshold: 10
      timeoutSeconds: 10
      periodSeconds: 10
      successThreshold: 1
    # -- Readiness probe settings
    readinessProbe:
      enabled: true
      path: /readyz
      initialDelaySeconds: 12
      failureThreshold: 10
      timeoutSeconds: 10
      periodSeconds: 10
      successThreshold: 1
    # -- Liveness probe settings
    livenessProbe:
      enabled: true
      path: /readyz
      initialDelaySeconds: 60
      failureThreshold: 10
      timeoutSeconds: 60
      periodSeconds: 60
      successThreshold: 1
    # -- Resources for Distributor container
    resources:
      requests:
        cpu: $DISTRIBUTOR_CPU_REQUESTS
        ephemeral-storage: $DISTRIBUTOR_EPHEMERAL_STORAGE_REQUESTS
        memory: $DISTRIBUTOR_MEMORY_REQUESTS
      limits:
        cpu: $DISTRIBUTOR_CPU_LIMIT
        ephemeral-storage: $DISTRIBUTOR_EPHEMERAL_STORAGE_LIMIT
        memory: $DISTRIBUTOR_MEMORY_LIMIT
    # -- SecurityContext for Distributor container
    securityContext: {}
    # -- Kubernetes service type (see https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types)
    serviceType: ClusterIP
    # -- Custom annotations for Distributor service
    serviceAnnotations: {}
    # -- Set externalTrafficPolicy to Local or Cluster (see https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
    # serviceExternalTrafficPolicy: ""
    # -- Set session affinity to None, ClientIP or ClientIPString
    # serviceSessionAffinity: ""
    # -- Tolerations for Distributor pods
    tolerations: []
    # -- Node selector for Distributor pods
    nodeSelector: {}
    # -- Priority class name for Distributor pods
    priorityClassName: "high"

  # Configuration for Event Bus component
  eventBus:
    # -- Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter)
    # imageRegistry:
    # -- Event Bus image name
    imageName: event-bus
    # -- Event Bus image tag (this overwrites global.seleniumGrid.imageTag parameter)
    # imageTag:

    # -- Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images)
    imagePullPolicy: IfNotPresent
    # -- Image pull secret (see https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
    imagePullSecret: ""

    # -- Specify extra environment variables for Event Bus
    extraEnvironmentVariables: []
    # -- Specify extra environment variables from ConfigMap and Secret for Event Bus
    extraEnvFrom: []
    # -- Specify affinity for Event Bus pods, this overwrites global.seleniumGrid.affinity parameter
    affinity: {}
    # -- Specify topologySpreadConstraints for Event Bus pods, this overwrites global.seleniumGrid.topologySpreadConstraints parameter
    topologySpreadConstraints: []
    # -- Custom annotations for Event Bus pods
    annotations: {}
    # -- Event Bus container port
    port: 5557
    # -- Event Bus expose NodePort
    nodePort: $NODE_PORT_EVENT_BUS
    # -- Container port where events are published
    publishPort: 4442
    # -- NodePort exposed where events are published
    publishNodePort: $PUBLISH_NODE_PORT_EVENT_BUS
    # -- Container port where to subscribe for events
    subscribePort: 4443
    # -- NodePort exposed where to subscribe for events
    subscribeNodePort: $SUBSCRIBE_NODE_PORT_EVENT_BUS
    # -- Resources for event-bus container
    resources:
      requests:
        cpu: $EVENTBUS_CPU_REQUESTS
        ephemeral-storage: $EVENTBUS_EPHEMERAL_STORAGE_REQUESTS
        memory: $EVENTBUS_MEMORY_REQUESTS
      limits:
        cpu: $EVENTBUS_CPU_LIMIT
        ephemeral-storage: $EVENTBUS_EPHEMERAL_STORAGE_LIMIT
        memory: $EVENTBUS_MEMORY_LIMIT
    # -- SecurityContext for event-bus container
    securityContext: {}
    # -- Kubernetes service type (see https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types)
    serviceType: NodePort
    # -- Set specific clusterIP when serviceType is ClusterIP (see https://kubernetes.io/docs/concepts/services-networking/service/#type-clusterip)
    # clusterIP: ""
    # -- Set specific externalName when serviceType is ExternalName (see https://kubernetes.io/docs/concepts/services-networking/service/#type-externalname)
    # externalName: ""
    # -- Set specific loadBalancerIP when serviceType is LoadBalancer (see https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer)
    # loadBalancerIP: ""
    # -- Custom annotations for Event Bus service
    serviceAnnotations: {}
    # -- Set externalTrafficPolicy to Local or Cluster (see https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
    # serviceExternalTrafficPolicy: ""
    # -- Set session affinity to None, ClientIP or ClientIPString
    # serviceSessionAffinity: ""
    # -- Tolerations for Event Bus pods
    tolerations: []
    # -- Node selector for Event Bus pods
    nodeSelector: {}
    # -- Priority class name for Event Bus pods
    priorityClassName: "high"

  # Configuration for Session Map component
  sessionMap:
    # -- Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter)
    # imageRegistry:
    # -- Session Map image name
    imageName: sessions
    # -- Session Map image tag (this overwrites global.seleniumGrid.imageTag parameter)
    # imageTag:

    # -- Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images)
    imagePullPolicy: IfNotPresent
    # -- Image pull secret (see https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
    # imagePullSecret: ""

    # -- Specify extra environment variables for Session Map
    extraEnvironmentVariables: []
    # -- Specify extra environment variables from ConfigMap and Secret for Session Map
    extraEnvFrom: []
    # -- Specify affinity for Session Map pods, this overwrites global.seleniumGrid.affinity parameter
    affinity: {}
    # -- Specify topologySpreadConstraints for Session Map pods, this overwrites global.seleniumGrid.topologySpreadConstraints parameter
    topologySpreadConstraints: []
    # -- Custom annotations for Session Map pods
    annotations: {}
    # -- Session Map container port
    port: 5556
    # -- Resources for Session Map container
    resources:
      requests:
        cpu: $SESSIONMAP_CPU_REQUESTS
        ephemeral-storage: $SESSIONMAP_EPHEMERAL_STORAGE_REQUESTS
        memory: $SESSIONMAP_MEMORY_REQUESTS
      limits:
        cpu: $SESSIONMAP_CPU_LIMIT
        ephemeral-storage: $SESSIONMAP_EPHEMERAL_STORAGE_LIMIT
        memory: $SESSIONMAP_MEMORY_LIMIT
    # -- SecurityContext for Session Map container
    securityContext: {}
    # -- Kubernetes service type (see https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types)
    serviceType: ClusterIP
    # -- Custom annotations for Session Map service
    serviceAnnotations: {}
    # -- Set externalTrafficPolicy to Local or Cluster (see https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
    # serviceExternalTrafficPolicy: ""
    # -- Set session affinity to None, ClientIP or ClientIPString
    # serviceSessionAffinity: ""
    # -- Tolerations for Session Map pods
    tolerations: []
    # -- Node selector for Session Map pods
    nodeSelector: {}
    # -- Priority class name for Session Map pods
    priorityClassName: "high"
    externalDatastore:
      # -- Enable external datastore for Session Map
      enabled: false
      # -- Backend for external datastore (supported: postgresql, redis). Details for each backend are described below config key
      backend: postgresql
      # -- Configure database backed Session Map (https://www.selenium.dev/documentation/grid/advanced_features/external_datastore/#database-backed-session-map)
      postgresql:
        implementation: "org.openqa.selenium.grid.sessionmap.jdbc.JdbcBackedSessionMap"
        jdbcUser: "seluser"
        jdbcPassword: "seluser"
        jdbcUrl: "jdbc:postgresql://{{ $.Release.Name }}-postgresql:5432/selenium_sessions"
      # -- Configure Redis backed Session Map (https://www.selenium.dev/documentation/grid/advanced_features/external_datastore/#redis-backed-session-map)
      redis:
        scheme: "redis"
        implementation: "org.openqa.selenium.grid.sessionmap.redis.RedisBackedSessionMap"
        hostname: "{{ $.Release.Name }}-redis-master"
        port: "6379"

  # Configuration for Session Queue component
  sessionQueue:
    # -- Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter)
    # imageRegistry:
    # -- Session Queue image name
    imageName: session-queue
    # -- Session Queue image tag (this overwrites global.seleniumGrid.imageTag parameter)
    # imageTag:

    # -- Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images)
    imagePullPolicy: IfNotPresent
    # -- Image pull secret (see https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
    imagePullSecret: ""

    # -- Specify extra environment variables for Session Queue
    extraEnvironmentVariables: []
    # -- Specify extra environment variables from ConfigMap and Secret for Session Queue
    extraEnvFrom: []
    # -- Specify affinity for Session Queue pods, this overwrites global.seleniumGrid.affinity parameter
    affinity: {}
    # -- Specify topologySpreadConstraints for Session Queue pods, this overwrites global.seleniumGrid.topologySpreadConstraints parameter
    topologySpreadConstraints: []
    # -- Custom annotations for Session Queue pods
    annotations: {}
    # -- Session Queue container port
    port: 5559
    # -- Session Queue expose NodePort
    nodePort: 30559
    # -- Resources for Session Queue container
    resources:
      requests:
        cpu: $SESSIONQUEUE_CPU_REQUESTS
        ephemeral-storage: $SESSIONQUEUE_EPHEMERAL_STORAGE_REQUESTS
        memory: $SESSIONQUEUE_MEMORY_REQUESTS
      limits:
        cpu: $SESSIONQUEUE_CPU_LIMIT
        ephemeral-storage: $SESSIONQUEUE_EPHEMERAL_STORAGE_LIMIT
        memory: $SESSIONQUEUE_MEMORY_LIMIT
    # -- SecurityContext for Session Queue container
    securityContext: {}
    # -- Kubernetes service type (see https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types)
    serviceType: ClusterIP
    # -- Custom annotations for Session Queue service
    serviceAnnotations: {}
    # -- Set externalTrafficPolicy to Local or Cluster (see https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
    # serviceExternalTrafficPolicy: ""
    # -- Set session affinity to None, ClientIP or ClientIPString
    # serviceSessionAffinity: ""
    # -- Tolerations for Session Queue pods
    tolerations: []
    # -- Node selector for Session Queue pods
    nodeSelector: {}
    # -- Priority class name for Session Queue pods
    priorityClassName: "high"

  # -- Custom sub path for all components
  subPath: "$INGRESS_AND_SUB_PATH"

  # -- Custom environment variables for all components
  extraEnvironmentVariables:
    - name: SE_SESSION_REQUEST_TIMEOUT
      value: "3600"
    - name: SE_JAVA_OPTS
      value: "-XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:MinRAMPercentage=100 -XX:MaxRAMPercentage=100"
    # - name: SE_ENABLE_TRACING
    #   value: "true"
    # - name: SE_JAVA_OPTS
    #   value: "-Xmx512m"
    # - name:
    #   valueFrom:
    #     secretKeyRef:
    #       name: secret-name
    #       key: secret-key

  # -- Custom environment variables by sourcing entire configMap, Secret, etc. for all components
  extraEnvFrom: []
    # - configMapRef:
    #   name: proxy-settings
    # - secretRef:
    #   name: mysecret

  # -- Extra volume mounts for component container
  extraVolumeMounts: []
  # - name: logs-volume
  #   mountPath: /opt/selenium/logs

  # -- Extra volumes for component pod
  extraVolumes: []
  # - name: logs-volume
  #   persistentVolumeClaim:
  #     claimName: external-logs-pvc

tracing:
  # -- Enable tracing. Implies installing Jaeger
  enabled: false
  # -- Enable tracing without automatically installing Jaeger
  enabledWithExistingEndpoint: $ENABLE_TRACING
  # -- Exporter type for tracing. Recommended `otlp` for wide compatibility with observability backends (e.g. Jaeger, Elastic, etc.)
  exporter: otlp
  # -- Exporter endpoint for pushing trace data
  exporterEndpoint: 'https://opentm-cloud.host'
  # -- Enable global auto-configuration for tracing
  globalAutoConfigure: true
  # ingress:
  #   # -- Enable ingress resource to access the Jaeger
  #   enabled: true
  #   # -- Annotations for Jaeger ingress resource
  #   annotations:
  #   # -- Configure paths for Jaeger ingress resource
  #   paths:
  #     - backend:
  #         service:
  #           name: "{{ .Release.Name }}-jaeger-query"
  #           port:
  #             number: 16686
  #       path: &jaegerBasePath "/jaeger"
  #       pathType: Prefix

monitoring:
  enabled: false
  enabledWithExistingAgent: false
  exporter:
    nameOverride: ""
    imageRegistry: "ricardbejarano"
    imageName: "graphql_exporter"
    imageTag: "latest"
    # -- Custom pull secret for container in patch job
    imagePullSecret: ""
    annotations: {}
    port: 9199
    service:
      # -- Create a service for exporter
      enabled: true
      # -- Service type
      type: ClusterIP
      # -- Set specific clusterIP when serviceType is ClusterIP (see https://kubernetes.io/docs/concepts/services-networking/service/#type-clusterip)
      # clusterIP: ""
      # -- Set specific externalName when serviceType is ExternalName (see https://kubernetes.io/docs/concepts/services-networking/service/#type-externalname)
      # externalName: ""
      # -- Set specific loadBalancerIP when serviceType is LoadBalancer (see https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer)
      # loadBalancerIP: ""
      # -- Node port for service
      nodePort: 30199
      # -- Annotations for exporter service
      annotations: {}
      # -- Set externalTrafficPolicy to Local or Cluster (see https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
      # externalTrafficPolicy: ""
      # -- Set session affinity to None, ClientIP or ClientIPString
      # sessionAffinity: ""
    replicas: 1
  additionalScrapeConfigs:
    # key: ""
    # value: ""
  annotations: {}

# Keda scaled object configuration
autoscaling:
  # -- Enable autoscaling. Implies installing KEDA
  enabled: false
  # -- Enable autoscaling without automatically installing KEDA
  enableWithExistingKEDA: true
  # -- Which type of KEDA scaling to use: job or deployment
  scalingType: job
  # -- Specify an external KEDA TriggerAuthentication resource is used for scaler triggers config. Apply for all browser nodes
  authenticationRef:
    # name: ""
    annotations:
      "helm.sh/hook": post-install,post-upgrade,post-rollback
      # TriggerAuthentication is used by ScaledObject/ScaledJob, hence weight should be less than those hooks
      "helm.sh/hook-weight": "0"
  # Configuration for ScaledObject triggers https://keda.sh/docs/latest/reference/scaledobject-spec/#triggers
  # -- Enables caching of metric values during polling interval (as specified in .spec.pollingInterval, the default: false in KEDA).
  useCachedMetrics: false
  # -- The type of metric that should be used (The default: AverageValue in KEDA)
  metricType: ""
  # -- Annotations for KEDA resources: ScaledObject and ScaledJob
  annotations:
    "helm.sh/hook": post-install,post-upgrade,post-rollback
    # Ensure the weight should be higher than TriggerAuthentication hook
    "helm.sh/hook-weight": "1"
  patchObjectFinalizers:
    # -- Override the name of the patch job
    # nameOverride:
    # -- Enable patching finalizers for KEDA scaled resources. Workaround for Hook post-upgrade selenium-grid/templates/x-node-hpa.yaml failed: object is being deleted: scaledobjects.keda.sh "x" already exists
    enabled: false
    # -- Deadline (in seconds) for patch job to complete
    activeDeadlineSeconds: 120
    # -- Annotations for patch job
    annotations:
      "helm.sh/hook": post-install,post-upgrade,post-rollback,pre-delete
      "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation
      # This should be run before all other hooks (since delete action is called), so use a negative weight
      "helm.sh/hook-weight": "-1"
    # -- Define an external service account name contains permissions to patch KEDA scaled resources
    serviceAccount: "$KUBERNETES_NAMESPACE-sa"
    # -- Custom pull secret for container in patch job
    imagePullSecret: ""
    # -- Define resources for container in patch job
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 200m
        memory: 500Mi
  # -- Options for KEDA scaled resources (keep only common options used for both ScaledJob and ScaledObject)
  scaledOptions:
    # -- Minimum number of replicas
    minReplicaCount: 0
    # -- Maximum number of replicas
    maxReplicaCount: 220
    # -- Polling interval in seconds
    pollingInterval: 5
    # List of triggers. Be careful, the default trigger of selenium-grid will be overwritten if you specify this
    # triggers:
  # Options for KEDA ScaledJobs (only used when scalingType is set to "job"). See https://keda.sh/docs/latest/concepts/scaling-jobs/#scaledjob-spec
  scaledJobOptions:
    scalingStrategy:
      # -- Scaling strategy for KEDA ScaledJob - https://keda.sh/docs/latest/reference/scaledjob-spec/#scalingstrategy
      strategy: default
    # -- Number of Completed jobs should be kept
    successfulJobsHistoryLimit: 0
    # -- Number of Failed jobs should be kept (for troubleshooting purposes)
    failedJobsHistoryLimit: 0
    # -- Specify job target ref for KEDA ScaledJob
    jobTargetRef:
      parallelism: 1
      completions: 1
      backoffLimit: 0
  # Options for KEDA ScaledObjects (only used when scalingType is set to "deployment"). See https://keda.sh/docs/latest/concepts/scaling-deployments/#scaledobject-spec
  scaledObjectOptions:
    scaleTargetRef:
      # -- Target reference for KEDA ScaledObject
      kind: Deployment
  # -- Define terminationGracePeriodSeconds for scalingType "deployment". Period for `deregisterLifecycle` to gracefully shut down the node before force terminating it
  terminationGracePeriodSeconds: 3600
  # -- Define preStop command to shut down the node gracefully when scalingType is set to "deployment"
  deregisterLifecycle:
   preStop:
     exec:
       command: [ "bash", "-c", "/opt/bin/nodePreStop.sh" ]

# Configuration additional nodes with different versions, capabilities, etc.
crossBrowsers:
  # -- Additional chrome nodes, array of objects with the same structure as `chromeNode`
  chromeNode:
    - nameOverride:
  # - Refer to file `multiple-nodes-platform-version.yaml` to configure additional nodes
  # -- Additional firefox nodes, array of objects with the same structure as `firefoxNode`
  firefoxNode:
    - nameOverride:
  # - Refer to file `multiple-nodes-platform-version.yaml` to configure additional node browsers
  # -- Additional edge nodes, array of objects with the same structure as `edgeNode`
  edgeNode:
    - nameOverride:
  # - Refer to file `multiple-nodes-platform-version.yaml` to configure additional node browsers
  # -- Additional release nodes, array of objects with the same structure as `relayNode`
  relayNode:
    - nameOverride:

# Configuration for chrome nodes
chromeNode:
  # -- Enable chrome nodes
  enabled: $ADD_DEFAULT_BROWSERS

  # -- NOTE: Only used when autoscaling.enabled is false
  # Enable creation of Deployment
  # true (default) - if you want long-living pods
  # false - for provisioning your own custom type such as Jobs
  deploymentEnabled: false
  # -- Global update strategy will be overwritten by individual component
  updateStrategy:
    type: RollingUpdate
  # -- Number of chrome nodes
  replicas: 1
  # -- Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter)
  # imageRegistry:
  # -- Image of chrome nodes
  imageName: node-chrome
  # -- Image of chrome nodes (this overwrites global.seleniumGrid.nodesImageTag)
  # imageTag:
  # -- Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images)
  imagePullPolicy: IfNotPresent
  # -- Image pull secret (see https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
  imagePullSecret: ""

  # -- Extra ports list to enable on the node container (e.g. SSH, VNC, NoVNC, etc.)
  ports: []
  # - 5900
  # - 7900
  # -- Node component port
  port: 5555
  # -- Node component expose NodePort
  nodePort:
  # -- Specify affinity for chrome-node pods, this overwrites global.seleniumGrid.affinity parameter
  affinity: {}
  # -- Specify topologySpreadConstraints for chrome-node pods, this overwrites global.seleniumGrid.topologySpreadConstraints parameter
  topologySpreadConstraints: []
  # -- Annotations for chrome-node pods
  annotations: {}
  # -- Labels for chrome-node pods
  labels: {}
  # -- Shared process namespace for chrome-node pods
  shareProcessNamespace: true
  # Resources for chrome-node container
  resources:
    # -- Request resources for chrome-node pods
    requests:
      memory: "1Gi"
      cpu: "1"
    # -- Limit resources for chrome-node pods
    limits:
      memory: "2Gi"
      cpu: "1"
  # -- SecurityContext for chrome-node container
  securityContext: {}
  # -- Tolerations for chrome-node pods
  tolerations: []
  # -- Node selector for chrome-node pods
  nodeSelector: {}
  # -- Custom host aliases for chrome nodes
  hostAliases:
    # - ip: "198.51.100.0"
    #   hostnames:
    #     - "example.com"
    #     - "example.net"
    # - ip: "203.0.113.0"
    #   hostnames:
    #     - "example.org"
  # -- Custom environment variables for chrome nodes
  extraEnvironmentVariables:
    - name: SE_SESSION_REQUEST_TIMEOUT
      value: "3600"
    # - name: SE_ENABLE_TRACING
    #   value: "true"
    # - name: SE_VNC_NO_PASSWORD
    #   value: "1"
    # - name: SE_VNC_VIEW_ONLY
    #   value: "1"
    # - name: SE_JAVA_OPTS
    #   value: "-Xmx512m"
    # - name:
    #   valueFrom:
    #     secretKeyRef:
    #       name: secret-name
    #       key: secret-key
  # -- Custom environment variables by sourcing entire configMap, Secret, etc. for chrome nodes
  extraEnvFrom: []
    # - configMapRef:
    #   name: proxy-settings
    # - secretRef:
    #   name: mysecret
  # Service configuration
  service:
    # -- Create a service for node
    enabled: false
    # -- Service type
    type: ClusterIP
    # -- Set specific loadBalancerIP when serviceType is LoadBalancer (see https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer)
    loadBalancerIP: ""
    # -- Extra ports exposed in node service
    ports:
    # - name: vnc-port
    #   port: 5900
    #   targetPort: 5900
    # -- Custom annotations for service
    annotations: {}
    # -- Set externalTrafficPolicy to Local or Cluster (see https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
    # externalTrafficPolicy: ""
    # -- Set session affinity to None, ClientIP or ClientIPString
    # sessionAffinity: ""
  # -- Size limit for DSH volume mounted in container (if not set, default is disabled, e.g "1Gi")
  # dshmVolumeSizeLimit: ""
  # -- Priority class name for chrome-node pods
  # priorityClassName: ""

  # -- Startup probe settings
  startupProbe:
    enabled: true
    path: /status
    initialDelaySeconds: 0
    periodSeconds: 5
    timeoutSeconds: 60
    failureThreshold: 12
    successThreshold: 1

  # -- Readiness probe settings
  readinessProbe:
    enabled: false
    path: /status
    initialDelaySeconds: 10
    failureThreshold: 10
    timeoutSeconds: 10
    periodSeconds: 10
    successThreshold: 1

  # -- Liveness probe settings
  livenessProbe:
    enabled: false
    path: /status
    initialDelaySeconds: 30
    failureThreshold: 6
    timeoutSeconds: 60
    periodSeconds: 10
    successThreshold: 1

  # -- Time to wait for pod termination
  terminationGracePeriodSeconds: 30
  # -- Define preStop command to shut down the chrome node gracefully. This overwrites autoscaling.deregisterLifecycle
  deregisterLifecycle:
  # -- Define postStart and preStop events. This overwrites the defined preStop in deregisterLifecycle if any
  lifecycle: {}
  # -- Extra volume mounts for chrome-node container
  extraVolumeMounts: []
  # - name: my-extra-volume
  #   mountPath: /home/seluser/Downloads

  # -- Extra volumes for chrome-node pod
  extraVolumes: []
  # - name: my-extra-volume
  #   emptyDir: {}
  # - name: my-extra-volume-from-pvc
  #   persistentVolumeClaim:
  #     claimName: my-pv-claim

  # -- Override the number of max sessions per node
  nodeMaxSessions:
  # -- Override the scaled options for chrome nodes
  scaledOptions:
  # -- Override the scaledJobOptions for chrome nodes
  scaledJobOptions:
  # -- Override the scaledObjectOptions for chrome nodes
  scaledObjectOptions:
  hpa:
    # -- browserName should match with Node stereotype and request capability is scaled by this scaler
    browserName: "chrome"
    # -- sessionBrowserName if the browserName is different from the sessionBrowserName
    sessionBrowserName: "chrome"
    # -- browserVersion should match with Node stereotype and request capability is scaled by this scaler
    # browserVersion: ""
    # -- platformName should match with Node stereotype and request capability is scaled by this scaler
    platformName: "linux"
    # browserVersion: '91.0' # Optional. Only required when supporting multiple versions of browser in your Selenium Grid.
    # -- Skip check SSL when connecting to the Graphql endpoint
    unsafeSsl: '{{ template "seleniumGrid.graphqlURL.unsafeSsl" . }}'  # Optional

  # -- It is used to add initContainers in the same pod of the browser node.
  # It should be set using the --set-json option
  initContainers: []

  # -- It is used to add sidecars proxy in the same pod of the browser node.
  # It means it will add a new container to the deployment itself.
  # It should be set using the --set-json option
  sidecars: []
  # -- Override specific video recording settings for chrome node
  videoRecorder: {}

# Configuration for firefox nodes
firefoxNode:
  # -- Enable firefox nodes
  enabled: $ADD_DEFAULT_BROWSERS

  # -- NOTE: Only used when autoscaling.enabled is false
  # Enable creation of Deployment
  # true (default) - if you want long living pods
  # false - for provisioning your own custom type such as Jobs
  deploymentEnabled: false
  # -- Global update strategy will be overwritten by individual component
  updateStrategy:
    type: RollingUpdate
  # -- Number of firefox nodes
  replicas: 1
  # -- Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter)
  # imageRegistry:
  # -- Image of firefox nodes
  imageName: node-firefox
  # -- Image of firefox nodes (this overwrites global.seleniumGrid.nodesImageTag)
  # imageTag:
  # -- Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images)
  imagePullPolicy: IfNotPresent
  # -- Image pull secret (see https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
  imagePullSecret: ""

  # -- Extra ports list to enable on the node container (e.g. SSH, VNC, NoVNC, etc.)
  ports: []
  # - 5900
  # - 7900
  # -- Node component port
  port: 5555
  # -- Node component expose NodePort
  nodePort:
  # -- Specify affinity for firefox-node pods, this overwrites global.seleniumGrid.affinity parameter
  affinity: {}
  # -- Specify topologySpreadConstraints for firefox-node pods, this overwrites global.seleniumGrid.topologySpreadConstraints parameter
  topologySpreadConstraints: []
  # -- Annotations for firefox-node pods
  annotations: {}
  # -- Labels for firefox-node pods
  labels: {}
  # -- Tolerations for firefox-node pods
  tolerations: []
  # -- Node selector for firefox-node pods
  nodeSelector: {}
  # -- Shared process namespace for firefox-node pods
  shareProcessNamespace: true
  # Resources for firefox-node container
  resources:
    # -- Request resources for firefox-node pods
    requests:
      memory: "1Gi"
      cpu: "1"
    # -- Limit resources for firefox-node pods
    limits:
      memory: "2Gi"
      cpu: "1"
  # -- SecurityContext for firefox-node container
  securityContext: {}
  # -- Custom host aliases for firefox nodes
  hostAliases:
    # - ip: "198.51.100.0"
    #   hostnames:
    #     - "example.com"
    #     - "example.net"
    # - ip: "203.0.113.0"
    #   hostnames:
    #     - "example.org"
  # -- Custom environment variables for firefox nodes
  extraEnvironmentVariables: []
    # - name: SE_JAVA_OPTS
    #   value: "-Xmx512m"
    # - name:
    #   valueFrom:
    #     secretKeyRef:
    #       name: secret-name
    #       key: secret-key
  # -- Custom environment variables by sourcing entire configMap, Secret, etc. for firefox nodes
  extraEnvFrom: []
    # - configMapRef:
    #   name: proxy-settings
    # - secretRef:
    #   name: mysecret
  # Service configuration
  service:
    # -- Create a service for node
    enabled: false
    # -- Service type
    type: ClusterIP
    # -- Set specific loadBalancerIP when serviceType is LoadBalancer (see https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer)
    loadBalancerIP: ""
    # -- Extra ports exposed in node service
    ports:
    # - name: vnc-port
    #   port: 5900
    #   targetPort: 5900
    # -- Custom annotations for service
    annotations: {}
    # -- Set externalTrafficPolicy to Local or Cluster (see https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
    # externalTrafficPolicy: ""
    # -- Set session affinity to None, ClientIP or ClientIPString
    # sessionAffinity: ""
  # -- Size limit for DSH volume mounted in container (if not set, default is disabled, e.g "1Gi")
  dshmVolumeSizeLimit: "2Gi"
  # -- Priority class name for firefox-node pods
  # priorityClassName: ""

  # -- Startup probe settings
  startupProbe:
    enabled: true
    path: /status
    initialDelaySeconds: 0
    periodSeconds: 5
    timeoutSeconds: 60
    failureThreshold: 12
    successThreshold: 1

  # -- Readiness probe settings
  readinessProbe:
    enabled: false
    path: /status
    initialDelaySeconds: 10
    failureThreshold: 10
    timeoutSeconds: 10
    periodSeconds: 10
    successThreshold: 1

  # -- Liveness probe settings
  livenessProbe:
    enabled: false
    path: /status
    initialDelaySeconds: 30
    failureThreshold: 6
    timeoutSeconds: 60
    periodSeconds: 10
    successThreshold: 1

  # -- Time to wait for pod termination
  terminationGracePeriodSeconds: 30
  # -- Define preStop command to shuts down the chrome node gracefully. This overwrites autoscaling.deregisterLifecycle
  deregisterLifecycle:
  # -- Define postStart and preStop events. This overwrites the defined preStop in deregisterLifecycle if any
  lifecycle: {}
  # -- Extra volume mounts for firefox-node container
  extraVolumeMounts: []
  # - name: my-extra-volume
  #   mountPath: /home/seluser/Downloads

  # -- Extra volumes for firefox-node pod
  extraVolumes: []
  # - name: my-extra-volume
  #   emptyDir: {}
  # - name: my-extra-volume-from-pvc
  #   persistentVolumeClaim:
  #     claimName: my-pv-claim

  # -- Override the number of max sessions per node
  nodeMaxSessions:
  # -- Override the scaled options for firefox nodes
  scaledOptions:
  # -- Override the scaledJobOptions for firefox nodes
  scaledJobOptions:
  # -- Override the scaledObjectOptions for firefox nodes
  scaledObjectOptions:
  hpa:
    # -- browserName should match with Node stereotype and request capability is scaled by this scaler
    browserName: "firefox"
    # -- sessionBrowserName if the browserName is different from the sessionBrowserName
    sessionBrowserName: "firefox"
    # -- browserVersion should match with Node stereotype and request capability is scaled by this scaler
    # browserVersion: ""
    # -- platformName should match with Node stereotype and request capability is scaled by this scaler
    platformName: "linux"
    # -- Skip check SSL when connecting to the Graphql endpoint
    unsafeSsl: '{{ template "seleniumGrid.graphqlURL.unsafeSsl" . }}'  # Optional

  # -- It is used to add initContainers in the same pod of the browser node.
  # It should be set using the --set-json option
  initContainers: []

  # -- It is used to add sidecars proxy in the same pod of the browser node.
  # It means it will add a new container to the deployment itself.
  # It should be set using the --set-json option
  sidecars: []
  # -- Override specific video recording settings for firefox node
  videoRecorder: {}

# Configuration for edge nodes
edgeNode:
  # -- Enable edge nodes
  enabled: $ADD_DEFAULT_BROWSERS

  # -- NOTE: Only used when autoscaling.enabled is false
  # Enable creation of Deployment
  # true (default) - if you want long living pods
  # false - for provisioning your own custom type such as Jobs
  deploymentEnabled: false
  # -- Global update strategy will be overwritten by individual component
  updateStrategy:
    type: RollingUpdate
  # -- Number of edge nodes
  replicas: 1
  # -- Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter)
  # imageRegistry:
  # -- Image of edge nodes
  imageName: node-edge
  # -- Image of edge nodes (this overwrites global.seleniumGrid.nodesImageTag)
  # imageTag:
  # -- Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images)
  imagePullPolicy: IfNotPresent
  # -- Image pull secret (see https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
  imagePullSecret: ""

  # -- Extra ports list to enable on the node container (e.g. SSH, VNC, NoVNC, etc.)
  ports: []
  # - 5900
  # - 7900
  # -- Node component port
  port: 5555
  # -- Node component expose NodePort
  nodePort:
  # -- Specify affinity for edge-node pods, this overwrites global.seleniumGrid.affinity parameter
  affinity: {}
  # -- Specify topologySpreadConstraints for edge-node pods, this overwrites global.seleniumGrid.topologySpreadConstraints parameter
  topologySpreadConstraints: []
  # -- Annotations for edge-node pods
  annotations: {}
  # -- Labels for edge-node pods
  labels: {}
  # -- Tolerations for edge-node pods
  tolerations: []
  # -- Node selector for edge-node pods
  nodeSelector: {}
  # -- Shared process namespace for edge-node pods
  shareProcessNamespace: true
  # Resources for edge-node container
  resources:
    # -- Request resources for edge-node pods
    requests:
      memory: "1Gi"
      cpu: "1"
    # -- Limit resources for edge-node pods
    limits:
      memory: "2Gi"
      cpu: "1"
  # -- SecurityContext for edge-node container
  securityContext: {}
  # -- Custom host aliases for edge nodes
  hostAliases:
    # - ip: "198.51.100.0"
    #   hostnames:
    #     - "example.com"
    #     - "example.net"
    # - ip: "203.0.113.0"
    #   hostnames:
    #     - "example.org"
  # -- Custom environment variables for edge nodes
  extraEnvironmentVariables: []
    # - name: SE_JAVA_OPTS
    #   value: "-Xmx512m"
    # - name:
    #   valueFrom:
    #     secretKeyRef:
    #       name: secret-name
    #       key: secret-key
  # -- Custom environment variables by sourcing entire configMap, Secret, etc. for edge nodes
  extraEnvFrom: []
    # - configMapRef:
    #   name: proxy-settings
    # - secretRef:
    #   name: mysecret
  # Service configuration
  service:
    # -- Create a service for node
    enabled: false
    # -- Service type
    type: ClusterIP
    # -- Set specific loadBalancerIP when serviceType is LoadBalancer (see https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer)
    # loadBalancerIP: ""
    # -- Extra ports exposed in node service
    ports:
    # - name: vnc-port
    #   port: 5900
    #   targetPort: 5900
    # -- Custom annotations for service
    annotations: {}
    # -- Set externalTrafficPolicy to Local or Cluster (see https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
    # externalTrafficPolicy: ""
    # -- Set session affinity to None, ClientIP or ClientIPString
    # sessionAffinity: ""
  # -- Size limit for DSH volume mounted in container (if not set, default is disabled, e.g "1Gi")
  # dshmVolumeSizeLimit: ""
  # -- Priority class name for edge-node pods
  # priorityClassName: ""

  # -- Startup probe settings
  startupProbe:
    enabled: true
    path: /status
    initialDelaySeconds: 0
    periodSeconds: 5
    timeoutSeconds: 60
    failureThreshold: 12
    successThreshold: 1

  # -- Readiness probe settings
  readinessProbe:
    enabled: false
    path: /status
    initialDelaySeconds: 10
    failureThreshold: 10
    timeoutSeconds: 10
    periodSeconds: 10
    successThreshold: 1

  # -- Liveness probe settings
  livenessProbe:
    enabled: false
    path: /status
    initialDelaySeconds: 30
    failureThreshold: 6
    timeoutSeconds: 60
    periodSeconds: 10
    successThreshold: 1

  # -- Time to wait for pod termination
  terminationGracePeriodSeconds: 30
  # -- Define preStop command to shuts down the chrome node gracefully. This overwrites autoscaling.deregisterLifecycle
  deregisterLifecycle:
  # -- Define postStart and preStop events. This overwrites the defined preStop in deregisterLifecycle if any
  lifecycle: {}
  # -- Extra volume mounts for edge-node container
  extraVolumeMounts: []
  # - name: my-extra-volume
  #   mountPath: /home/seluser/Downloads

  # -- Extra volumes for edge-node pod
  extraVolumes: []
  # - name: my-extra-volume
  #   emptyDir: {}
  # - name: my-extra-volume-from-pvc
  #   persistentVolumeClaim:
  #     claimName: my-pv-claim

  # -- Override the number of max sessions per node
  nodeMaxSessions:
  # -- Override the scaled options for edge nodes
  scaledOptions:
  # -- Override the scaledJobOptions for edge nodes
  scaledJobOptions:
  # -- Override the scaledObjectOptions for edge nodes
  scaledObjectOptions:
  hpa:
    # -- browserName should match with Node stereotype and request capability is scaled by this scaler
    browserName: "MicrosoftEdge"
    # -- sessionBrowserName if the browserName is different from the sessionBrowserName
    sessionBrowserName: "msedge"
    # -- browserVersion should match with Node stereotype and request capability is scaled by this scaler
    # browserVersion: ""
    # -- platformName should match with Node stereotype and request capability is scaled by this scaler
    platformName: "linux"
    # -- Skip check SSL when connecting to the Graphql endpoint
    unsafeSsl: '{{ template "seleniumGrid.graphqlURL.unsafeSsl" . }}'  # Optional

  # -- It is used to add initContainers in the same pod of the browser node.
  # It should be set using the --set-json option
  initContainers: []

  # -- It is used to add sidecars proxy in the same pod of the browser node.
  # It means it will add a new container to the deployment itself.
  # It should be set using the --set-json option
  sidecars: []
  # -- Override specific video recording settings for edge node
  videoRecorder: {}

# Configuration for relay nodes
relayNode:
  # -- Enable relay nodes
  enabled: false

  # -- NOTE: Only used when autoscaling.enabled is false
  # Enable creation of Deployment
  # true (default) - if you want long-living pods
  # false - for provisioning your own custom type such as Jobs
  deploymentEnabled: true
  # -- Global update strategy will be overwritten by individual component
  updateStrategy:
    type: RollingUpdate
  # -- Number of relay nodes
  replicas: 1
  # -- Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter)
  imageRegistry:
  # -- Image of relay nodes
  imageName: node-base
  # -- Image of relay nodes (this overwrites global.seleniumGrid.nodesImageTag)
  imageTag:
  # -- Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images)
  imagePullPolicy: IfNotPresent
  # -- Image pull secret (see https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
  imagePullSecret: ""

  # -- Extra ports list to enable on the node container (e.g. SSH, VNC, NoVNC, etc.)
  ports: []
  # - 5900
  # - 7900
  # -- Node component port
  port: 5555
  # -- Node component expose NodePort
  nodePort:
  # -- Specify affinity for relay-node pods, this overwrites global.seleniumGrid.affinity parameter
  affinity: {}
  # -- Specify topologySpreadConstraints for relay-node pods, this overwrites global.seleniumGrid.topologySpreadConstraints parameter
  topologySpreadConstraints: []
  # -- Annotations for relay-node pods
  annotations: {}
  # -- Labels for relay-node pods
  labels: {}
  # -- Shared process namespace for relay-node pods
  shareProcessNamespace: true
  # Resources for relay-node container
  resources:
    # -- Request resources for relay-node pods
    requests:
      memory: "1Gi"
      cpu: "1"
    # -- Limit resources for relay-node pods
    limits:
      memory: "2Gi"
      cpu: "1"
  # -- SecurityContext for relay-node container
  securityContext: {}
  # -- Tolerations for relay-node pods
  tolerations: []
  # -- Node selector for relay-node pods
  nodeSelector: {}
  # -- Custom host aliases for relay nodes
  hostAliases:
  # - ip: "198.51.100.0"
  #   hostnames:
  #     - "example.com"
  #     - "example.net"
  # - ip: "203.0.113.0"
  #   hostnames:
  #     - "example.org"
  # -- Custom environment variables for relay nodes
  extraEnvironmentVariables: []
  # - name: SE_JAVA_OPTS
  #   value: "-Xmx512m"
  # - name:
  #   valueFrom:
  #     secretKeyRef:
  #       name: secret-name
  #       key: secret-key
  # -- Custom environment variables by sourcing entire configMap, Secret, etc. for relay nodes
  extraEnvFrom: []
  # - configMapRef:
  #   name: proxy-settings
  # - secretRef:
  #   name: mysecret
  # Service configuration
  service:
    # -- Create a service for node
    enabled: false
    # -- Service type
    type: ClusterIP
    # -- Set specific loadBalancerIP when serviceType is LoadBalancer (see https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer)
    loadBalancerIP: ""
    # -- Extra ports exposed in node service
    ports:
    # - name: vnc-port
    #   port: 5900
    #   targetPort: 5900
    # -- Custom annotations for service
    annotations: {}
    # -- Set externalTrafficPolicy to Local or Cluster (see https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
    # externalTrafficPolicy: ""
    # -- Set session affinity to None, ClientIP or ClientIPString
    # sessionAffinity: ""
  # -- Size limit for DSH volume mounted in container (if not set, default is disabled, e.g "1Gi")
  # dshmVolumeSizeLimit: ""
  # -- Priority class name for relay-node pods
  # priorityClassName: ""

  # -- Startup probe settings
  startupProbe:
    enabled: true
    path: /status
    initialDelaySeconds: 0
    periodSeconds: 5
    timeoutSeconds: 60
    failureThreshold: 12
    successThreshold: 1

  # -- Readiness probe settings
  readinessProbe:
    enabled: false
    path: /status
    initialDelaySeconds: 10
    failureThreshold: 10
    timeoutSeconds: 10
    periodSeconds: 10
    successThreshold: 1

  # -- Liveness probe settings
  livenessProbe:
    enabled: false
    path: /status
    initialDelaySeconds: 30
    failureThreshold: 6
    timeoutSeconds: 60
    periodSeconds: 10
    successThreshold: 1

  # -- Time to wait for pod termination
  terminationGracePeriodSeconds: 30
  # -- Define preStop command to shut down the relay node gracefully. This overwrites autoscaling.deregisterLifecycle
  deregisterLifecycle:
  # -- Define postStart and preStop events. This overwrites the defined preStop in deregisterLifecycle if any
  lifecycle: {}
  # -- Extra volume mounts for relay-node container
  extraVolumeMounts: []
  # - name: my-extra-volume
  #   mountPath: /home/seluser/Downloads

  # -- Extra volumes for relay-node pod
  extraVolumes: []
  # - name: my-extra-volume
  #   emptyDir: {}
  # - name: my-extra-volume-from-pvc
  #   persistentVolumeClaim:
  #     claimName: my-pv-claim

  # -- Override the number of max sessions per node
  nodeMaxSessions:
  # -- Override the scaled options for relay nodes
  scaledOptions:
  # -- Override the scaledJobOptions for relay nodes
  scaledJobOptions:
  # -- Override the scaledObjectOptions for relay nodes
  scaledObjectOptions:
  hpa:
    # -- browserName should match with Node stereotype and request capability is scaled by this scaler
    browserName: "chrome"
    # -- sessionBrowserName if the browserName is different from the sessionBrowserName
    # sessionBrowserName: ""
    # -- browserVersion should match with Node stereotype and request capability is scaled by this scaler
    # browserVersion: ""
    # -- platformName should match with Node stereotype and request capability is scaled by this scaler
    platformName: "Android"
    # -- Skip check SSL when connecting to the Graphql endpoint
    unsafeSsl: '{{ template "seleniumGrid.graphqlURL.unsafeSsl" . }}'  # Optional

  # -- It is used to add initContainers in the same pod of the browser node.
  # It should be set using the --set-json option
  initContainers: []

  # -- It is used to add sidecars proxy in the same pod of the browser node.
  # It means it will add a new container to the deployment itself.
  # It should be set using the --set-json option
  sidecars: []
  # -- Override specific video recording settings for edge node
  videoRecorder: {}

# Video recording configuration for all browser nodes. Can be overridden by each browser node
videoRecorder:
  # -- Enable video recording in all browser nodes
  enabled: $ADD_VIDEO_RECORDING
  # -- Container name is set to resource specs
  name: video
  # -- Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter)
  # imageRegistry:
  # -- Image of video recorder
  imageName: video
  # -- Image of video recorder (this overwrites global.seleniumGrid.videoImageTag)
  # imageTag:
  # -- Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images)
  imagePullPolicy: IfNotPresent
  # -- Directory to store video files in the container
  targetFolder: "/videos"
  uploader:
    # -- Enable video uploader
    enabled: $ADD_VIDEO_RECORDING
    # -- Where to upload the video file e.g. remoteName://bucketName/path. Refer to destination syntax of rclone https://rclone.org/docs/
    destinationPrefix: "s3-selenium-video:$S3_BUCKET/video/"
    # -- What uploader to use (default is empty, internal upload in video container). See .videRecorder.s3 for how to create a new external sidecar container.
    name:
    # -- Uploader config file name
    configFileName: upload.conf
    # -- Uploader entry point file name
    entryPointFileName: upload.sh
    # -- For environment variables used in uploader which contains sensitive information, store in secret and refer envFrom
    # Set config for rclone via ENV var with format: RCLONE_CONFIG_ + name of remote + _ + name of config file option (make it all uppercase)
    secrets:
    #  RCLONE_CONFIG_S3_TYPE: "s3"
    #  RCLONE_CONFIG_S3_PROVIDER: "AWS"
    #  RCLONE_CONFIG_S3_ENV_AUTH: "true"
    #  RCLONE_CONFIG_S3_REGION: "ap-southeast-1"
    #  RCLONE_CONFIG_S3_LOCATION_CONSTRAINT: "ap-southeast-1"
    #  RCLONE_CONFIG_S3_ACL: "private"
    #  RCLONE_CONFIG_S3_ACCESS_KEY_ID: "xxx"
    #  RCLONE_CONFIG_S3_SECRET_ACCESS_KEY: "xxx"
    #  RCLONE_CONFIG_S3_NO_CHECK_BUCKET: "true"
    #  RCLONE_CONFIG_GS_TYPE: "s3"
    #  RCLONE_CONFIG_GS_PROVIDER: "GCS"
    #  RCLONE_CONFIG_GS_ENV_AUTH: "true"
    #  RCLONE_CONFIG_GS_REGION: "asia-southeast1"
    #  RCLONE_CONFIG_GS_LOCATION_CONSTRAINT: "asia-southeast1"
    #  RCLONE_CONFIG_GS_ACL: "private"
    #  RCLONE_CONFIG_GS_ACCESS_KEY_ID: "xxx"
    #  RCLONE_CONFIG_GS_SECRET_ACCESS_KEY: "xxx"
    #  RCLONE_CONFIG_GS_ENDPOINT: "https://storage.googleapis.com"
    #  RCLONE_CONFIG_GS_NO_CHECK_BUCKET: "true"
  # -- Video recording container port
  ports:
    - 9000
  resources:
    # -- Request resources for video recorder pods
    requests:
      memory: "128Mi"
      cpu: "0.1"
    # -- Limit resources for video recorder pods
    limits:
      memory: "1Gi"
      cpu: "1"
  # -- SecurityContext for recorder container
  securityContext:
  # -- Extra environment variables for video recorder
  extraEnvironmentVariables: []
  # -- Custom environment variables by sourcing entire configMap, Secret, etc. for video recorder.
  extraEnvFrom: []
  # - configMapRef:
  #   name: proxy-settings
  # - secretRef:
  #   name: mysecret
  # -- Terminating grace period for video recorder
  terminationGracePeriodSeconds: 30

  # -- Startup probe settings
  startupProbe: {}
  #   httpGet:
  #     path: /
  #     port: 9000
  #   failureThreshold: 120
  # periodSeconds: 5

  # -- Liveness probe settings
  livenessProbe: {}
  # -- Define lifecycle events for video recorder
  lifecycle: {}

  # -- Custom video recorder back-end scripts (video.sh, video_ready.py, etc.) further by ConfigMap.
  # NOTE: For the mount point with the name "video", or "video-scripts", it will override the default. For other names, it will be appended.
  extraVolumeMounts: []
  # - name: video-scripts
  #   mountPath: /opt/bin/video.sh
  #   subPath: custom_video.sh
  # - name: video-scripts
  #   mountPath: /opt/bin/video_ready.py
  #   subPath: video_ready.py

  # -- Extra volumes for video recorder pod
  extraVolumes: []
  # - name: video-scripts
  #   configMap:
  #     name: my-video-scripts-cm
  #     defaultMode: 0500
  # - name: video
  #   persistentVolumeClaim:
  #     claimName: video-pv-claim

  # -- Container spec for the uploader if above it is defined as "uploader.name: s3"
  s3:
    imageRegistry: bitnami
    imageName: aws-cli
    imageTag: latest
    imagePullPolicy: IfNotPresent
    securityContext:
      runAsUser: 0
    command: []
    args: []
    extraEnvironmentVariables: []
    # - name: AWS_ACCESS_KEY_ID
    #   value: aws_access_key_id
    # - name: AWS_SECRET_ACCESS_KEY
    #   value: aws_secret_access_key
    # - name: AWS_REGION
    #   value: region
    # - name:
    #   valueFrom:
    #     secretKeyRef:
    #       name: secret-name
    #       key: secret-key

# -- Custom labels for k8s resources
customLabels: {}

# Configuration for dependency chart keda
keda:
  enabled: false

# -- Configuration for dependency chart ingress-nginx
ingress-nginx:
  enabled: false

# -- Configuration for dependency chart kube-prometheus-stack
prometheus-stack:
  enabled: false

# -- Configuration for dependency chart jaeger
jaeger:
  enabled: false
postgresql:
  enabled: false
redis:
  enabled: false

@Doofus100500
Copy link
Contributor Author

Regarding the main issue, I rolled back to 0.38.1 and 4.27.0-20241204, and so far, no issues have been observed.

@VietND96
Copy link
Member

In the meantime, can you validate with the latest version 4.29.0?

@Doofus100500
Copy link
Contributor Author

Updated it yesterday, no issues so far. We’ll see how it performs under load today.

@Doofus100500
Copy link
Contributor Author

The only remaining issue is the current memory problem with the router. I'll try to create a heap histogram with jmap and share it here: #2528

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants