Skip to content

Commit f857196

Browse files
committed
chart: add templates for relay node
Signed-off-by: Viet Nguyen Duc <[email protected]>
1 parent a5e252c commit f857196

File tree

12 files changed

+458
-6
lines changed

12 files changed

+458
-6
lines changed

Makefile

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ KEDA_TAG_PREV_VERSION := $(or $(KEDA_TAG_PREV_VERSION),$(KEDA_TAG_PREV_VERSION),
3030
KEDA_TAG_VERSION := $(or $(KEDA_TAG_VERSION),$(KEDA_TAG_VERSION),2.15.1-selenium-grid)
3131
KEDA_BASED_NAME := $(or $(KEDA_BASED_NAME),$(KEDA_BASED_NAME),ndviet)
3232
KEDA_BASED_TAG := $(or $(KEDA_BASED_TAG),$(KEDA_BASED_TAG),2.15.1-selenium-grid-20241017)
33+
ANDROID_PLATFORM_API := $(or $(ANDROID_PLATFORM_API),$(ANDROID_PLATFORM_API),14)
3334

3435
all: hub \
3536
distributor \
@@ -755,7 +756,7 @@ test_node_relay: hub node_base standalone_firefox
755756
echo ANDROID_BASED_NAME=$(or $(ANDROID_BASED_NAME),budtmo) >> .env ; \
756757
echo ANDROID_BASED_IMAGE=$(or $(ANDROID_BASED_IMAGE),docker-android) >> .env ; \
757758
echo ANDROID_BASED_TAG=$(or $(ANDROID_BASED_TAG),emulator_14.0) >> .env ; \
758-
echo ANDROID_PLATFORM_API=$(or $(ANDROID_PLATFORM_API),14) >> .env ; \
759+
echo ANDROID_PLATFORM_API=$(ANDROID_PLATFORM_API) >> .env ; \
759760
echo TEST_DELAY_AFTER_TEST=$(or $(TEST_DELAY_AFTER_TEST), 0) >> .env ; \
760761
echo NODE=$$node >> .env ; \
761762
echo TEST_NODE_RELAY=$$node >> .env ; \
@@ -957,6 +958,14 @@ chart_test_autoscaling_playwright_connect_grid:
957958
TEMPLATE_OUTPUT_FILENAME="k8s_playwright_connect_grid_basicAuth_secureIngress_ingressPublicIP_autoScaling_patchKEDA.yaml" \
958959
./tests/charts/make/chart_test.sh JobAutoscaling
959960

961+
chart_test_autoscaling_node_relay_command:
962+
PLATFORMS=$(PLATFORMS) CHART_ENABLE_TRACING=false SELENIUM_GRID_MONITORING=false CHART_ENABLE_BASIC_AUTH=false \
963+
TEST_NODE_RELAY=Android ANDROID_PLATFORM_API=$(ANDROID_PLATFORM_API) SELENIUM_ENABLE_MANAGED_DOWNLOADS=false \
964+
SELENIUM_GRID_PROTOCOL=http SELENIUM_GRID_HOST=$$(hostname -i) \
965+
VERSION=$(TAG_VERSION) VIDEO_TAG=$(FFMPEG_TAG_VERSION)-$(BUILD_DATE) KEDA_BASED_NAME=$(KEDA_BASED_NAME) KEDA_BASED_TAG=$(KEDA_BASED_TAG) NAMESPACE=$(NAMESPACE) BINDING_VERSION=$(BINDING_VERSION) \
966+
TEMPLATE_OUTPUT_FILENAME="k8s_playwright_connect_grid_basicAuth_secureIngress_ingressPublicIP_autoScaling_patchKEDA.yaml" \
967+
./tests/charts/make/chart_test.sh DeploymentAutoscaling
968+
960969
chart_test_delete:
961970
helm del test -n selenium || true
962971
helm del selenium -n selenium || true

charts/selenium-grid/CONFIGURATION.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,56 @@ A Helm chart for creating a Selenium Grid Server in Kubernetes
522522
| videoRecorder.extraVolumeMounts | list | `[]` | 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. |
523523
| videoRecorder.extraVolumes | list | `[]` | Extra volumes for video recorder pod |
524524
| videoRecorder.s3 | object | `{"args":[],"command":[],"extraEnvironmentVariables":null,"imageName":"aws-cli","imagePullPolicy":"IfNotPresent","imageRegistry":"bitnami","imageTag":"latest","securityContext":{"runAsUser":0}}` | Container spec for the uploader if above it is defined as "uploader.name: s3" |
525+
| relayNode.enabled | bool | `false` | Enable relay nodes |
526+
| relayNode.deploymentEnabled | bool | `true` | 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 |
527+
| relayNode.updateStrategy | object | `{"type":"RollingUpdate"}` | Global update strategy will be overwritten by individual component |
528+
| relayNode.replicas | int | `1` | Number of relay nodes |
529+
| relayNode.imageRegistry | string | `nil` | Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter) |
530+
| relayNode.imageName | string | `"node-base"` | Image of relay nodes |
531+
| relayNode.imageTag | string | `nil` | Image of relay nodes (this overwrites global.seleniumGrid.nodesImageTag) |
532+
| relayNode.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy (see https://kubernetes.io/docs/concepts/containers/images/#updating-images) |
533+
| relayNode.imagePullSecret | string | `""` | Image pull secret (see https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/) |
534+
| relayNode.ports | list | `[]` | Extra ports list to enable on the node container (e.g. SSH, VNC, NoVNC, etc.) |
535+
| relayNode.port | int | `5555` | Node component port |
536+
| relayNode.nodePort | string | `nil` | Node component expose NodePort |
537+
| relayNode.affinity | object | `{}` | Specify affinity for relay-node pods, this overwrites global.seleniumGrid.affinity parameter |
538+
| relayNode.topologySpreadConstraints | list | `[]` | Specify topologySpreadConstraints for relay-node pods, this overwrites global.seleniumGrid.topologySpreadConstraints parameter |
539+
| relayNode.annotations | object | `{}` | Annotations for relay-node pods |
540+
| relayNode.labels | object | `{}` | Labels for relay-node pods |
541+
| relayNode.shareProcessNamespace | bool | `true` | Shared process namespace for relay-node pods |
542+
| relayNode.resources.requests | object | `{"cpu":"1","memory":"1Gi"}` | Request resources for relay-node pods |
543+
| relayNode.resources.limits | object | `{"cpu":"1","memory":"2Gi"}` | Limit resources for relay-node pods |
544+
| relayNode.securityContext | object | `{}` | SecurityContext for relay-node container |
545+
| relayNode.tolerations | list | `[]` | Tolerations for relay-node pods |
546+
| relayNode.nodeSelector | object | `{}` | Node selector for relay-node pods |
547+
| relayNode.hostAliases | string | `nil` | Custom host aliases for relay nodes |
548+
| relayNode.extraEnvironmentVariables | string | `nil` | Custom environment variables for relay nodes |
549+
| relayNode.extraEnvFrom | string | `nil` | Custom environment variables by sourcing entire configMap, Secret, etc. for relay nodes |
550+
| relayNode.service.enabled | bool | `false` | Create a service for node |
551+
| relayNode.service.type | string | `"ClusterIP"` | Service type |
552+
| relayNode.service.loadBalancerIP | string | `""` | Set specific loadBalancerIP when serviceType is LoadBalancer (see https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer) |
553+
| relayNode.service.ports | string | `nil` | Extra ports exposed in node service |
554+
| relayNode.service.annotations | object | `{}` | Custom annotations for service |
555+
| relayNode.dshmVolumeSizeLimit | string | `""` | Size limit for DSH volume mounted in container (if not set, default is disabled, e.g "1Gi") |
556+
| relayNode.priorityClassName | string | `""` | Priority class name for relay-node pods |
557+
| relayNode.startupProbe | object | `{"enabled":true,"failureThreshold":12,"initialDelaySeconds":0,"path":"/status","periodSeconds":5,"successThreshold":1,"timeoutSeconds":60}` | Startup probe settings |
558+
| relayNode.readinessProbe | object | `{"enabled":false,"failureThreshold":10,"initialDelaySeconds":10,"path":"/status","periodSeconds":10,"successThreshold":1,"timeoutSeconds":10}` | Readiness probe settings |
559+
| relayNode.livenessProbe | object | `{"enabled":false,"failureThreshold":6,"initialDelaySeconds":30,"path":"/status","periodSeconds":10,"successThreshold":1,"timeoutSeconds":60}` | Liveness probe settings |
560+
| relayNode.terminationGracePeriodSeconds | int | `30` | Time to wait for pod termination |
561+
| relayNode.deregisterLifecycle | string | `nil` | Define preStop command to shut down the relay node gracefully. This overwrites autoscaling.deregisterLifecycle |
562+
| relayNode.lifecycle | object | `{}` | Define postStart and preStop events. This overwrites the defined preStop in deregisterLifecycle if any |
563+
| relayNode.extraVolumeMounts | list | `[]` | Extra volume mounts for relay-node container |
564+
| relayNode.extraVolumes | list | `[]` | Extra volumes for relay-node pod |
565+
| relayNode.nodeMaxSessions | string | `nil` | Override the number of max sessions per node |
566+
| relayNode.scaledOptions | string | `nil` | Override the scaled options for relay nodes |
567+
| relayNode.scaledJobOptions | string | `nil` | Override the scaledJobOptions for relay nodes |
568+
| relayNode.scaledObjectOptions | string | `nil` | Override the scaledObjectOptions for relay nodes |
569+
| relayNode.hpa.browserName | string | `"chrome"` | browserName from the capability |
570+
| relayNode.hpa.sessionBrowserName | string | `""` | sessionBrowserName if the browserName is different from the sessionBrowserName |
571+
| relayNode.hpa.platformName | string | `"Android"` | platformName from the capability |
572+
| relayNode.hpa.unsafeSsl | string | `"{{ template \"seleniumGrid.graphqlURL.unsafeSsl\" . }}"` | Skip check SSL when connecting to the Graphql endpoint |
573+
| relayNode.initContainers | list | `[]` | It is used to add initContainers in the same pod of the browser node. It should be set using the --set-json option |
574+
| relayNode.sidecars | list | `[]` | 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 |
525575
| customLabels | object | `{}` | Custom labels for k8s resources |
526576
| keda.image | object | `{"keda":{"registry":"selenium","repository":"keda","tag":"2.15.1-selenium-grid-20241024"},"metricsApiServer":{"registry":"selenium","repository":"keda-metrics-apiserver","tag":"2.15.1-selenium-grid-20241024"},"webhooks":{"registry":"selenium","repository":"keda-admission-webhooks","tag":"2.15.1-selenium-grid-20241024"}}` | Specify image for KEDA components |
527577
| keda.additionalAnnotations | string | `nil` | Annotations for KEDA resources |

charts/selenium-grid/templates/_nameHelpers.tpl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,13 @@ Edge node fullname
140140
{{- tpl (default (include "seleniumGrid.component.name" (list "selenium-edge-node" $)) .Values.edgeNode.nameOverride) $ | trunc 63 | trimSuffix "-" -}}
141141
{{- end -}}
142142

143+
{{/*
144+
Relay node fullname
145+
*/}}
146+
{{- define "seleniumGrid.relayNode.fullname" -}}
147+
{{- tpl (default (include "seleniumGrid.component.name" (list "selenium-relay-node" $)) .Values.relayNode.nameOverride) $ | trunc 63 | trimSuffix "-" -}}
148+
{{- end -}}
149+
143150
{{/*
144151
Ingress fullname
145152
*/}}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{{- if and .Values.relayNode.enabled ((eq (include "seleniumGrid.useKEDA" .) "true") | ternary (eq .Values.autoscaling.scalingType "deployment") .Values.relayNode.deploymentEnabled) }}
2+
apiVersion: apps/v1
3+
kind: Deployment
4+
metadata:
5+
name: {{ template "seleniumGrid.relayNode.fullname" . }}
6+
namespace: {{ .Release.Namespace }}
7+
labels:
8+
app: {{ template "seleniumGrid.relayNode.fullname" . }}
9+
app.kubernetes.io/name: {{ template "seleniumGrid.relayNode.fullname" . }}
10+
{{- include "seleniumGrid.commonLabels" . | nindent 4 }}
11+
{{- with .Values.relayNode.labels }}
12+
{{- toYaml . | nindent 4 }}
13+
{{- end }}
14+
{{- with .Values.customLabels }}
15+
{{- toYaml . | nindent 4 }}
16+
{{- end }}
17+
spec:
18+
strategy:
19+
{{- template "seleniumGrid.updateStrategy" (list $.Values.relayNode $.Values.global.seleniumGrid) }}
20+
{{- if not (eq (include "seleniumGrid.useKEDA" $) "true") }}
21+
replicas: {{ .Values.relayNode.replicas }}
22+
{{- else }}
23+
replicas: {{ default $.Values.autoscaling.scaledOptions.minReplicaCount ($.Values.relayNode.scaledOptions).minReplicaCount }}
24+
{{- end }}
25+
revisionHistoryLimit: {{ .Values.global.seleniumGrid.revisionHistoryLimit }}
26+
selector:
27+
matchLabels:
28+
app: {{ template "seleniumGrid.relayNode.fullname" . }}
29+
app.kubernetes.io/instance: {{ .Release.Name }}
30+
{{- $podScope := deepCopy . -}}
31+
{{- $_ := set $podScope "name" (include "seleniumGrid.relayNode.fullname" .) -}}
32+
{{- $_ = set $podScope "node" .Values.relayNode -}}
33+
{{- $_ = set $podScope "uploader" (get .Values.videoRecorder (.Values.videoRecorder.uploader.name | toString)) -}}
34+
{{- include "seleniumGrid.podTemplate" $podScope | nindent 2 }}
35+
{{- end }}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{{- if and .Values.relayNode.enabled (eq (include "seleniumGrid.useKEDA" .) "true") (eq .Values.autoscaling.scalingType "deployment") }}
2+
apiVersion: keda.sh/v1alpha1
3+
kind: ScaledObject
4+
metadata:
5+
name: {{ template "seleniumGrid.relayNode.fullname" . }}
6+
namespace: {{ .Release.Namespace }}
7+
annotations:
8+
{{- with .Values.autoscaling.annotations }}
9+
{{- toYaml . | nindent 4 }}
10+
{{- end }}
11+
labels:
12+
deploymentName: {{ template "seleniumGrid.relayNode.fullname" . }}
13+
{{- include "seleniumGrid.commonLabels" . | nindent 4 }}
14+
{{- include "seleniumGrid.autoscalingLabels" . | nindent 4 }}
15+
{{- with .Values.relayNode.labels }}
16+
{{- toYaml . | nindent 4 }}
17+
{{- end }}
18+
{{- with .Values.customLabels }}
19+
{{- toYaml . | nindent 4 }}
20+
{{- end }}
21+
spec:
22+
{{- $podScope := deepCopy . -}}
23+
{{- $_ := set $podScope "name" (include "seleniumGrid.relayNode.fullname" .) -}}
24+
{{- $_ = set $podScope "node" .Values.relayNode -}}
25+
{{- include "seleniumGrid.autoscalingTemplate" $podScope | nindent 2 }}
26+
{{- end }}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{{- if and .Values.relayNode.enabled (include "seleniumGrid.useKEDA" .) (eq .Values.autoscaling.scalingType "job") }}
2+
apiVersion: keda.sh/v1alpha1
3+
kind: ScaledJob
4+
metadata:
5+
name: {{ template "seleniumGrid.relayNode.fullname" . }}
6+
namespace: {{ .Release.Namespace }}
7+
annotations:
8+
{{- with .Values.autoscaling.annotations }}
9+
{{- toYaml . | nindent 4 }}
10+
{{- end }}
11+
labels:
12+
app: {{ template "seleniumGrid.relayNode.fullname" . }}
13+
app.kubernetes.io/name: {{ template "seleniumGrid.relayNode.fullname" . }}
14+
{{- include "seleniumGrid.commonLabels" . | nindent 4 }}
15+
{{- include "seleniumGrid.autoscalingLabels" . | nindent 4 }}
16+
{{- with .Values.relayNode.labels }}
17+
{{- toYaml . | nindent 4 }}
18+
{{- end }}
19+
{{- with .Values.customLabels }}
20+
{{- toYaml . | nindent 4 }}
21+
{{- end }}
22+
spec:
23+
{{- $podScope := deepCopy . -}}
24+
{{- $_ := set $podScope "name" (include "seleniumGrid.relayNode.fullname" .) -}}
25+
{{- $_ = set $podScope "node" .Values.relayNode -}}
26+
{{- $_ = set $podScope "uploader" (get .Values.videoRecorder (.Values.videoRecorder.uploader.name | toString)) -}}
27+
{{- $_ = set $podScope "podTemplate" (include "seleniumGrid.podTemplate" $podScope | fromYaml) }}
28+
{{- include "seleniumGrid.autoscalingTemplate" $podScope | nindent 2 }}
29+
{{- end }}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{{- if and .Values.relayNode.enabled .Values.relayNode.service.enabled }}
2+
apiVersion: v1
3+
kind: Service
4+
metadata:
5+
name: {{ template "seleniumGrid.relayNode.fullname" . }}
6+
namespace: {{ .Release.Namespace }}
7+
labels:
8+
name: {{ template "seleniumGrid.relayNode.fullname" . }}
9+
{{- include "seleniumGrid.commonLabels" . | nindent 4 }}
10+
{{- with .Values.relayNode.service.annotations }}
11+
annotations:
12+
{{- toYaml . | nindent 4 }}
13+
{{- end }}
14+
spec:
15+
type: {{ .Values.relayNode.service.type }}
16+
selector:
17+
app: {{ template "seleniumGrid.relayNode.fullname" . }}
18+
app.kubernetes.io/instance: {{ .Release.Name }}
19+
{{- if and (eq .Values.relayNode.service.type "LoadBalancer") (.Values.relayNode.service.loadBalancerIP) }}
20+
loadBalancerIP: {{ .Values.relayNode.service.loadBalancerIP }}
21+
{{- end }}
22+
ports:
23+
- name: tcp-chrome
24+
protocol: TCP
25+
port: {{ .Values.relayNode.port }}
26+
targetPort: {{ .Values.relayNode.port }}
27+
{{- if and (eq $.Values.relayNode.service.type "NodePort") .Values.relayNode.nodePort }}
28+
nodePort: {{ .Values.relayNode.nodePort }}
29+
{{- end }}
30+
{{- with .Values.relayNode.service.ports }}
31+
{{- range . }}
32+
- name: {{ .name }}
33+
port: {{ .port }}
34+
targetPort: {{ .targetPort }}
35+
{{- if .protocol }}
36+
protocol: {{ .protocol }}
37+
{{- end }}
38+
{{- if and (eq $.Values.relayNode.service.type "NodePort") .nodePort }}
39+
nodePort: {{ .nodePort }}
40+
{{- end }}
41+
{{- end }}
42+
{{- end }}
43+
{{- end }}

0 commit comments

Comments
 (0)