You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: website_and_docs/content/blog/2026/selenium-grid-4-41-deep-dive.md
+9-9Lines changed: 9 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -145,7 +145,7 @@ spec:
145
145
claimName: selenium-assets
146
146
```
147
147
148
-
Event bus connectivity (host, ports, registration secret) is passed as environment variables. Browser stereotypes and Kubernetes-specific tuning (`termination-grace-period`, `assets-path`, resource overrides) live entirely in the TOML file inside the ConfigMap, keeping them independently updatable without redeploying the Node.
148
+
Event bus connectivity (host), and node config (session timeout) are passed as environment variables. Browser stereotypes live entirely in the TOML file inside the ConfigMap, keeping them independently updatable without redeploying the Node.
149
149
150
150
The [RBAC manifest](https://github.com/SeleniumHQ/docker-selenium/blob/4.41.0-20260222/kubernetes/DynamicGrid/BaseConfig/rbac.yaml) grants the Node the minimal permissions needed — `create`, `delete`, and `get` on `pods` and `pods/log` in the configured namespace. No cluster-wide permissions needed.
151
151
@@ -158,21 +158,21 @@ This means the browser Pods land on exactly the same node pool, zone, or hardwar
158
158
The practical implication: you can deploy **multiple Dynamic Grid Nodes**, each pinned to a different cluster segment via their own `nodeSelector` or `affinity`, and all registered to the same Hub. The Hub distributes session requests across them, and each Node provisions browser Pods that inherit its own placement constraints.
159
159
160
160
```
161
-
┌─────────────────────────────────┐
161
+
┌─────────────────────────────────-┐
162
162
│ Hub │
163
-
└──────┬──────────────┬───────────┘
163
+
└──────┬──────────────┬───────────-┘
164
164
│ │
165
-
┌────────────────▼──┐ ┌───▼────────────────┐
165
+
┌────────────────▼──┐ ┌───-▼────────────────┐
166
166
│ NodeKubernetes │ │ NodeKubernetes │
167
167
│ nodeSelector: │ │ nodeSelector: │
168
168
│ zone=us-west │ │ zone=us-east │
169
-
└────────┬──────────┘ └────────┬───────────┘
169
+
└────────┬──────────┘ └────────-┬───────────┘
170
170
│ inherits spec │ inherits spec
171
-
┌─────────▼──────────┐ ┌──────────▼──────────┐
171
+
┌─────────▼──────────┐ ┌──────────-▼──────────┐
172
172
│ browser Pod │ │ browser Pod │
173
173
│ (us-west, same │ │ (us-east, same │
174
174
│ tolerations...) │ │ tolerations...) │
175
-
└────────────────────┘ └─────────────────────┘
175
+
└────────────────────┘ └─────────────────────-┘
176
176
```
177
177
178
178
Teams can keep multiple Dynamic Nodes on standby — lightweight processes consuming minimal resources — and let the browser Pods scale horizontally on demand within each segment. This approach fits naturally into cluster autoscaler workflows: idle Nodes hold their spot in the cluster; browser Jobs drive the actual compute scaling.
@@ -229,7 +229,7 @@ The Node validates the event, enriches it with `nodeId`, `nodeUri`, and `timesta
229
229
230
230
### Multi-language client support
231
231
232
-
Firing events is surfaced directly on the driver instance in **all five official language bindings**. No manual HTTP wiring needed — the driver knows the session ID and Grid URL:
232
+
Firing events is surfaced directly on the driver instance in **all five official language bindings** (required binding version 4.41.0+ also). No manual HTTP wiring needed — the driver knows the session ID and Grid URL:
233
233
234
234
```python
235
235
# Python
@@ -329,7 +329,7 @@ Set `SE_UPLOAD_FAILURE_SESSION_ONLY=true` and the uploader will **skip cloud upl
329
329
A session is treated as failed under two conditions:
330
330
331
331
1. **Custom failure event fired** — your test framework calls `driver.fire_session_event("test:failed", ...)` during the session. The sidecar matches the event type against a configurable list of failure patterns.
332
-
2. **Abnormal close** — the session timed out or crashed without a clean `session-closed` event.
332
+
2. **Abnormal close reason** — the `session-closed` event is received but carries a `reason` other than `QUIT_COMMAND`. Currently, that means `TIMEOUT` (session exceeded the configured timeout) or `NODE_REMOVED` (the node was forcibly removed from the Grid). A clean `driver.quit()` sends `QUIT_COMMAND` and is never treated as a failure.
333
333
334
334
The failure event type matching is controlled by `SE_UPLOAD_FAILURE_SESSION_EVENTS` (default: `:failed,:failure`). The match is a substring check on the event type, so the default catches `test:failed`, `suite:failed`, `step:failure`, etc. You can extend the list for your own conventions:
0 commit comments