browserstack-node-sdk 1.34.38 → 1.34.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/ats/src/CFTemplates/hub-ha.yaml +81 -0
  2. package/ats/src/cloudproviders/AWS.js +1 -1
  3. package/ats/src/cloudproviders/Azure.js +1 -1
  4. package/ats/src/cloudproviders/CloudProvider.js +1 -1
  5. package/ats/src/cloudproviders/GoogleCloudProvider.js +1 -1
  6. package/ats/src/cloudproviders/utils.js +1 -1
  7. package/ats/src/commands/configure.js +1 -1
  8. package/ats/src/commands/connect.js +1 -1
  9. package/ats/src/commands/connect_commands/grid.js +1 -1
  10. package/ats/src/commands/create.js +1 -1
  11. package/ats/src/commands/create_commands/grid.js +1 -1
  12. package/ats/src/commands/delete.js +1 -1
  13. package/ats/src/commands/delete_commands/grid.js +1 -1
  14. package/ats/src/commands/init.js +1 -1
  15. package/ats/src/commands/list.js +1 -1
  16. package/ats/src/commands/list_commands/grid_profiles.js +1 -1
  17. package/ats/src/commands/list_commands/grids.js +1 -1
  18. package/ats/src/commands/start.js +1 -1
  19. package/ats/src/commands/start_commands/grid.js +1 -1
  20. package/ats/src/commands/stop.js +1 -1
  21. package/ats/src/commands/stop_commands/grid.js +1 -1
  22. package/ats/src/config/constants.js +1 -1
  23. package/ats/src/config/logger.js +1 -1
  24. package/ats/src/index.js +1 -1
  25. package/ats/src/templates/browserstack-secret.yaml +10 -0
  26. package/ats/src/templates/hub-deployment.yaml +25 -3
  27. package/ats/src/templates/hubharesources/bitnami-kafka.yaml +711 -0
  28. package/ats/src/templates/hubharesources/bitnami-redis.yaml +1048 -0
  29. package/ats/src/templates/hubharesources/browserstack-secret.yaml +10 -0
  30. package/ats/src/templates/hubharesources/efs-csi-driver-aws.yaml +401 -0
  31. package/ats/src/templates/hubharesources/federatedidentityuploader.json +50 -0
  32. package/ats/src/templates/hubharesources/storage-class.yaml +12 -0
  33. package/ats/src/templates/hubharesources/turboscale-uploader.yaml +53 -0
  34. package/ats/src/templates/nginx/helper.yaml +1 -0
  35. package/ats/src/templates/nginx/private-pods-and-services.yaml +1 -0
  36. package/ats/src/templates/turboscale-agent.yaml +0 -8
  37. package/ats/src/utils/AWSUtils.js +1 -1
  38. package/ats/src/utils/createAutoscalerStack.js +1 -1
  39. package/ats/src/utils/createClusterStack.js +1 -1
  40. package/ats/src/utils/createHubHaStack.js +1 -0
  41. package/ats/src/utils/createk8sClient.js +1 -1
  42. package/ats/src/utils/deleteEFSMountTargets.js +1 -0
  43. package/ats/src/utils/deleteStack.js +1 -1
  44. package/ats/src/utils/describeStack.js +1 -0
  45. package/ats/src/utils/gridComponents.js +1 -1
  46. package/ats/src/utils/hstUtils.js +1 -1
  47. package/ats/src/utils/instrumentationUtils.js +1 -1
  48. package/ats/src/utils/userInput.js +1 -1
  49. package/ats/src/utils/utilityMethods.js +1 -1
  50. package/ats/src/utils/webSocketUtils.js +1 -1
  51. package/package.json +1 -1
  52. package/src/ai-sdk-node/bundle.js +1 -1
  53. package/src/bin/codeceptjs/BrowserStackPlugin.js +1 -1
  54. package/src/bin/codeceptjs/command.js +1 -1
  55. package/src/bin/codeceptjs/helper.js +1 -1
  56. package/src/bin/codeceptjs/o11yHelper.js +1 -1
  57. package/src/bin/cucumber-js/command.js +1 -1
  58. package/src/bin/cucumber-js/formatter/custom_formatter.js +1 -1
  59. package/src/bin/cucumber-js/formatter/custom_formatter_old_versions.js +1 -1
  60. package/src/bin/cucumber-js/test-observability.js +1 -1
  61. package/src/bin/cucumber-js/test.setup.js +1 -1
  62. package/src/bin/cucumber-js/test_old.setup.js +1 -1
  63. package/src/bin/cucumber-js/timeout.setup.js +1 -1
  64. package/src/bin/integrations/command.js +1 -1
  65. package/src/bin/integrations/constants.js +1 -1
  66. package/src/bin/jest/command.js +1 -1
  67. package/src/bin/jest/customImplements/customCircus.js +1 -1
  68. package/src/bin/jest/customImplements/customEnvironment.js +1 -1
  69. package/src/bin/jest/customImplements/customJestAdapterInit.js +1 -1
  70. package/src/bin/jest/customImplements/customTestRunnerTemplate.js +1 -1
  71. package/src/bin/jest/jest.setup.js +1 -1
  72. package/src/bin/jest/test-observability/data-hooks.js +1 -1
  73. package/src/bin/jest/test-observability/helper.js +1 -1
  74. package/src/bin/jest/test-observability/obsReporter.js +1 -1
  75. package/src/bin/jest/test-observability/test-details.js +1 -1
  76. package/src/bin/jest/test_before.setup.js +1 -1
  77. package/src/bin/launcher/launcher.js +1 -1
  78. package/src/bin/mocha/accessibility-automation/helper.js +1 -1
  79. package/src/bin/mocha/bstack-reporter/customReporter.js +1 -1
  80. package/src/bin/mocha/command.js +1 -1
  81. package/src/bin/mocha/test-observability/builderPatch.js +1 -1
  82. package/src/bin/mocha/test-observability/data-hooks.js +1 -1
  83. package/src/bin/mocha/test-observability/mochaUtils.js +1 -1
  84. package/src/bin/mocha/test.setup.js +1 -1
  85. package/src/bin/nightwatch/command.js +1 -1
  86. package/src/bin/playwright/accessibility-helper.js +1 -1
  87. package/src/bin/playwright/command.js +1 -1
  88. package/src/bin/playwright/globalSetup.js +1 -1
  89. package/src/bin/playwright/mock-process.js +1 -1
  90. package/src/bin/playwright/modifyPlaywrightConf.js +1 -1
  91. package/src/bin/playwright/patches.js +1 -1
  92. package/src/bin/playwright/reporter/pwUtils.js +1 -1
  93. package/src/bin/playwright/reporter/reporter.js +1 -1
  94. package/src/bin/playwright/reporter/test-details.js +1 -1
  95. package/src/bin/playwright/sessionDetails.js +1 -1
  96. package/src/bin/runner.js +1 -1
  97. package/src/bin/setup.js +1 -1
  98. package/src/bin/test-runner/index.js +1 -1
  99. package/src/bin/test-runner/runTest.js +1 -1
  100. package/src/bin/test-runner/testWorker.js +1 -1
  101. package/src/bin/utils/constants.js +1 -1
  102. package/src/bin/utils/log4jsAppender.js +1 -1
  103. package/src/bin/utils/logPatcher.js +1 -1
  104. package/src/bin/utils/logReportingAPI.js +1 -1
  105. package/src/bin/vanilla-js/command.js +1 -1
  106. package/src/browserStackSdk.js +1 -1
  107. package/src/helpers/BrowserStackSetup.js +1 -1
  108. package/src/helpers/accessibility-automation/constants.js +1 -1
  109. package/src/helpers/accessibility-automation/helper.js +1 -1
  110. package/src/helpers/accessibility-automation/scripts.js +1 -1
  111. package/src/helpers/ai-sdk/aiSdkWrapper.js +1 -1
  112. package/src/helpers/ai-sdk/autoHealHelper.js +1 -1
  113. package/src/helpers/ats/constants.js +1 -1
  114. package/src/helpers/ats/helper.js +1 -1
  115. package/src/helpers/capsMapping.js +1 -1
  116. package/src/helpers/central-scanner/constants.js +1 -1
  117. package/src/helpers/central-scanner/helpers.js +1 -1
  118. package/src/helpers/globals.js +1 -1
  119. package/src/helpers/helper.js +1 -1
  120. package/src/helpers/logger.js +1 -1
  121. package/src/helpers/patchHelper.js +1 -1
  122. package/src/helpers/patchHelpers.js +1 -1
  123. package/src/helpers/percy/Percy.js +1 -1
  124. package/src/helpers/percy/PercyBinary.js +1 -1
  125. package/src/helpers/percy/PercyCaptureMap.js +1 -1
  126. package/src/helpers/percy/PercyCaptureModes.js +1 -1
  127. package/src/helpers/percy/PercySDK.js +1 -1
  128. package/src/helpers/percy/index.js +1 -1
  129. package/src/helpers/percy/utils.js +1 -1
  130. package/src/helpers/performance/constants.js +1 -1
  131. package/src/helpers/performance/performance-tester.js +1 -1
  132. package/src/helpers/processHelper.js +1 -1
  133. package/src/helpers/request-spy.js +1 -1
  134. package/src/helpers/setKeepAlive.js +1 -1
  135. package/src/helpers/test-observability/constants.js +1 -1
  136. package/src/helpers/test-observability/error-handler.js +1 -1
  137. package/src/helpers/test-observability/requestQueueHandler.js +1 -1
  138. package/src/helpers/test-observability/sessionHandler.js +1 -1
  139. package/src/helpers/test-observability/utils.js +1 -1
  140. package/src/helpers/testhub/constants.js +1 -1
  141. package/src/helpers/testhub/testhubHandler.js +1 -1
  142. package/src/helpers/testhub/utils.js +1 -1
  143. package/src/helpers/timeoutPromise.js +1 -1
  144. package/src/helpers/utilities.js +1 -1
  145. package/src/helpers/w3cMapping.js +1 -1
  146. package/src/hubAllocationMethods.js +1 -1
  147. package/src/index.js +1 -1
@@ -0,0 +1,711 @@
1
+ # Source: kafka/templates/networkpolicy.yaml
2
+ kind: NetworkPolicy
3
+ apiVersion: networking.k8s.io/v1
4
+ metadata:
5
+ name: turboscale-kafka
6
+ namespace: <HubHaNameSpace>
7
+ labels:
8
+ app.kubernetes.io/instance: turboscale
9
+ app.kubernetes.io/managed-by: Helm
10
+ app.kubernetes.io/name: kafka
11
+ app.kubernetes.io/version: 3.9.0
12
+ helm.sh/chart: kafka-31.1.1
13
+ spec:
14
+ podSelector:
15
+ matchLabels:
16
+ app.kubernetes.io/instance: turboscale
17
+ app.kubernetes.io/name: kafka
18
+ policyTypes:
19
+ - Ingress
20
+ - Egress
21
+ egress:
22
+ - {}
23
+ ingress:
24
+ # Allow client connections
25
+ - ports:
26
+ - port: 9092
27
+ - port: 9094
28
+ - port: 9093
29
+ ---
30
+ # Source: kafka/templates/broker/pdb.yaml
31
+ apiVersion: policy/v1
32
+ kind: PodDisruptionBudget
33
+ metadata:
34
+ name: turboscale-kafka-broker
35
+ namespace: <HubHaNameSpace>
36
+ labels:
37
+ app.kubernetes.io/instance: turboscale
38
+ app.kubernetes.io/managed-by: Helm
39
+ app.kubernetes.io/name: kafka
40
+ app.kubernetes.io/version: 3.9.0
41
+ helm.sh/chart: kafka-31.1.1
42
+ app.kubernetes.io/component: broker
43
+ app.kubernetes.io/part-of: kafka
44
+ spec:
45
+ maxUnavailable: 1
46
+ selector:
47
+ matchLabels:
48
+ app.kubernetes.io/instance: turboscale
49
+ app.kubernetes.io/name: kafka
50
+ app.kubernetes.io/component: broker
51
+ app.kubernetes.io/part-of: kafka
52
+ ---
53
+ # Source: kafka/templates/controller-eligible/pdb.yaml
54
+ apiVersion: policy/v1
55
+ kind: PodDisruptionBudget
56
+ metadata:
57
+ name: turboscale-kafka-controller
58
+ namespace: <HubHaNameSpace>
59
+ labels:
60
+ app.kubernetes.io/instance: turboscale
61
+ app.kubernetes.io/managed-by: Helm
62
+ app.kubernetes.io/name: kafka
63
+ app.kubernetes.io/version: 3.9.0
64
+ helm.sh/chart: kafka-31.1.1
65
+ app.kubernetes.io/component: controller-eligible
66
+ app.kubernetes.io/part-of: kafka
67
+ spec:
68
+ maxUnavailable: 1
69
+ selector:
70
+ matchLabels:
71
+ app.kubernetes.io/instance: turboscale
72
+ app.kubernetes.io/name: kafka
73
+ app.kubernetes.io/component: controller-eligible
74
+ app.kubernetes.io/part-of: kafka
75
+ ---
76
+ # Source: kafka/templates/provisioning/serviceaccount.yaml
77
+ apiVersion: v1
78
+ kind: ServiceAccount
79
+ metadata:
80
+ name: turboscale-kafka-provisioning
81
+ namespace: <HubHaNameSpace>
82
+ labels:
83
+ app.kubernetes.io/instance: turboscale
84
+ app.kubernetes.io/managed-by: Helm
85
+ app.kubernetes.io/name: kafka
86
+ app.kubernetes.io/version: 3.9.0
87
+ helm.sh/chart: kafka-31.1.1
88
+ automountServiceAccountToken: false
89
+ ---
90
+ # Source: kafka/templates/rbac/serviceaccount.yaml
91
+ apiVersion: v1
92
+ kind: ServiceAccount
93
+ metadata:
94
+ name: turboscale-kafka
95
+ namespace: <HubHaNameSpace>
96
+ labels:
97
+ app.kubernetes.io/instance: turboscale
98
+ app.kubernetes.io/managed-by: Helm
99
+ app.kubernetes.io/name: kafka
100
+ app.kubernetes.io/version: 3.9.0
101
+ helm.sh/chart: kafka-31.1.1
102
+ app.kubernetes.io/component: kafka
103
+ automountServiceAccountToken: false
104
+ ---
105
+ # Source: kafka/templates/secrets.yaml
106
+ apiVersion: v1
107
+ kind: Secret
108
+ metadata:
109
+ name: turboscale-kafka-user-passwords
110
+ namespace: <HubHaNameSpace>
111
+ labels:
112
+ app.kubernetes.io/instance: turboscale
113
+ app.kubernetes.io/managed-by: Helm
114
+ app.kubernetes.io/name: kafka
115
+ app.kubernetes.io/version: 3.9.0
116
+ helm.sh/chart: kafka-31.1.1
117
+ type: Opaque
118
+ data:
119
+ system-user-password: "RXB5ZDVuWGJSSw=="
120
+ inter-broker-password: "TmlZOTRGd0tLSw=="
121
+ controller-password: "N0dwWTlIUFVTag=="
122
+ ---
123
+ # Source: kafka/templates/secrets.yaml
124
+ apiVersion: v1
125
+ kind: Secret
126
+ metadata:
127
+ name: turboscale-kafka-kraft-cluster-id
128
+ namespace: <HubHaNameSpace>
129
+ labels:
130
+ app.kubernetes.io/instance: turboscale
131
+ app.kubernetes.io/managed-by: Helm
132
+ app.kubernetes.io/name: kafka
133
+ app.kubernetes.io/version: 3.9.0
134
+ helm.sh/chart: kafka-31.1.1
135
+ type: Opaque
136
+ data:
137
+ kraft-cluster-id: "QXcyZzBOdnJxQUVLb1Ntc2VPWVR2Rw=="
138
+ ---
139
+ # Source: kafka/templates/controller-eligible/configmap.yaml
140
+ apiVersion: v1
141
+ kind: ConfigMap
142
+ metadata:
143
+ name: turboscale-kafka-controller-configuration
144
+ namespace: <HubHaNameSpace>
145
+ labels:
146
+ app.kubernetes.io/instance: turboscale
147
+ app.kubernetes.io/managed-by: Helm
148
+ app.kubernetes.io/name: kafka
149
+ app.kubernetes.io/version: 3.9.0
150
+ helm.sh/chart: kafka-31.1.1
151
+ app.kubernetes.io/component: controller-eligible
152
+ app.kubernetes.io/part-of: kafka
153
+ data:
154
+ server.properties: |-
155
+ # Listeners configuration
156
+ listeners=CLIENT://:9092,INTERNAL://:9094,CONTROLLER://:9093
157
+ advertised.listeners=CLIENT://advertised-address-placeholder:9092,INTERNAL://advertised-address-placeholder:9094
158
+ listener.security.protocol.map=CLIENT:SASL_PLAINTEXT,INTERNAL:SASL_PLAINTEXT,CONTROLLER:SASL_PLAINTEXT
159
+ # KRaft process roles
160
+ process.roles=controller,broker
161
+ #node.id=
162
+ controller.listener.names=CONTROLLER
163
+ controller.quorum.voters=0@turboscale-kafka-controller-0.turboscale-kafka-controller-headless.<HubHaNameSpace>.svc.cluster.local:9093,1@turboscale-kafka-controller-1.turboscale-kafka-controller-headless.<HubHaNameSpace>.svc.cluster.local:9093,2@turboscale-kafka-controller-2.turboscale-kafka-controller-headless.<HubHaNameSpace>.svc.cluster.local:9093
164
+ # Kraft Controller listener SASL settings
165
+ sasl.mechanism.controller.protocol=PLAIN
166
+ listener.name.controller.sasl.enabled.mechanisms=PLAIN
167
+ listener.name.controller.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="controller_user" password="controller-password-placeholder" user_controller_user="controller-password-placeholder";
168
+ # Kafka data logs directory
169
+ log.dir=/bitnami/kafka/data
170
+ # Kafka application logs directory
171
+ logs.dir=/opt/bitnami/kafka/logs
172
+
173
+ # Turboscale Kafka Configuration
174
+ log.retention.hours=4
175
+ # log.retention.minutes=30
176
+ auto.create.topics.enable=true
177
+ num.partitions=40
178
+
179
+ # Common Kafka Configuration
180
+
181
+ sasl.enabled.mechanisms=PLAIN,SCRAM-SHA-256,SCRAM-SHA-512
182
+ # Interbroker configuration
183
+ inter.broker.listener.name=INTERNAL
184
+ sasl.mechanism.inter.broker.protocol=PLAIN
185
+ # Listeners SASL JAAS configuration
186
+ listener.name.client.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required user_user1="password-placeholder-0";
187
+ listener.name.client.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
188
+ listener.name.client.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
189
+ listener.name.internal.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="inter_broker_user" password="interbroker-password-placeholder" user_inter_broker_user="interbroker-password-placeholder" user_user1="password-placeholder-0";
190
+ listener.name.internal.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="inter_broker_user" password="interbroker-password-placeholder";
191
+ listener.name.internal.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="inter_broker_user" password="interbroker-password-placeholder";
192
+ # End of SASL JAAS configuration
193
+
194
+ # Custom Kafka Configuration
195
+ ---
196
+ # Source: kafka/templates/scripts-configmap.yaml
197
+ apiVersion: v1
198
+ kind: ConfigMap
199
+ metadata:
200
+ name: turboscale-kafka-scripts
201
+ namespace: <HubHaNameSpace>
202
+ labels:
203
+ app.kubernetes.io/instance: turboscale
204
+ app.kubernetes.io/managed-by: Helm
205
+ app.kubernetes.io/name: kafka
206
+ app.kubernetes.io/version: 3.9.0
207
+ helm.sh/chart: kafka-31.1.1
208
+ data:
209
+ kafka-init.sh: |-
210
+ #!/bin/bash
211
+
212
+ set -o errexit
213
+ set -o nounset
214
+ set -o pipefail
215
+
216
+ error(){
217
+ local message="${1:?missing message}"
218
+ echo "ERROR: ${message}"
219
+ exit 1
220
+ }
221
+
222
+ retry_while() {
223
+ local -r cmd="${1:?cmd is missing}"
224
+ local -r retries="${2:-12}"
225
+ local -r sleep_time="${3:-5}"
226
+ local return_value=1
227
+
228
+ read -r -a command <<< "$cmd"
229
+ for ((i = 1 ; i <= retries ; i+=1 )); do
230
+ "${command[@]}" && return_value=0 && break
231
+ sleep "$sleep_time"
232
+ done
233
+ return $return_value
234
+ }
235
+
236
+ replace_in_file() {
237
+ local filename="${1:?filename is required}"
238
+ local match_regex="${2:?match regex is required}"
239
+ local substitute_regex="${3:?substitute regex is required}"
240
+ local posix_regex=${4:-true}
241
+
242
+ local result
243
+
244
+ # We should avoid using 'sed in-place' substitutions
245
+ # 1) They are not compatible with files mounted from ConfigMap(s)
246
+ # 2) We found incompatibility issues with Debian10 and "in-place" substitutions
247
+ local -r del=$'\001' # Use a non-printable character as a 'sed' delimiter to avoid issues
248
+ if [[ $posix_regex = true ]]; then
249
+ result="$(sed -E "s${del}${match_regex}${del}${substitute_regex}${del}g" "$filename")"
250
+ else
251
+ result="$(sed "s${del}${match_regex}${del}${substitute_regex}${del}g" "$filename")"
252
+ fi
253
+ echo "$result" > "$filename"
254
+ }
255
+
256
+ kafka_conf_set() {
257
+ local file="${1:?missing file}"
258
+ local key="${2:?missing key}"
259
+ local value="${3:?missing value}"
260
+
261
+ # Check if the value was set before
262
+ if grep -q "^[#\\s]*$key\s*=.*" "$file"; then
263
+ # Update the existing key
264
+ replace_in_file "$file" "^[#\\s]*${key}\s*=.*" "${key}=${value}" false
265
+ else
266
+ # Add a new key
267
+ printf '\n%s=%s' "$key" "$value" >>"$file"
268
+ fi
269
+ }
270
+
271
+ replace_placeholder() {
272
+ local placeholder="${1:?missing placeholder value}"
273
+ local password="${2:?missing password value}"
274
+ local -r del=$'\001' # Use a non-printable character as a 'sed' delimiter to avoid issues with delimiter symbols in sed string
275
+ sed -i "s${del}$placeholder${del}$password${del}g" "$KAFKA_CONFIG_FILE"
276
+ }
277
+
278
+ append_file_to_kafka_conf() {
279
+ local file="${1:?missing source file}"
280
+ local conf="${2:?missing kafka conf file}"
281
+
282
+ cat "$1" >> "$2"
283
+ }
284
+
285
+ configure_external_access() {
286
+ # Configure external hostname
287
+ if [[ -f "/shared/external-host.txt" ]]; then
288
+ host=$(cat "/shared/external-host.txt")
289
+ elif [[ -n "${EXTERNAL_ACCESS_HOST:-}" ]]; then
290
+ host="$EXTERNAL_ACCESS_HOST"
291
+ elif [[ -n "${EXTERNAL_ACCESS_HOSTS_LIST:-}" ]]; then
292
+ read -r -a hosts <<<"$(tr ',' ' ' <<<"${EXTERNAL_ACCESS_HOSTS_LIST}")"
293
+ host="${hosts[$POD_ID]}"
294
+ elif [[ "$EXTERNAL_ACCESS_HOST_USE_PUBLIC_IP" =~ ^(yes|true)$ ]]; then
295
+ host=$(curl -s https://ipinfo.io/ip)
296
+ else
297
+ error "External access hostname not provided"
298
+ fi
299
+
300
+ # Configure external port
301
+ if [[ -f "/shared/external-port.txt" ]]; then
302
+ port=$(cat "/shared/external-port.txt")
303
+ elif [[ -n "${EXTERNAL_ACCESS_PORT:-}" ]]; then
304
+ if [[ "${EXTERNAL_ACCESS_PORT_AUTOINCREMENT:-}" =~ ^(yes|true)$ ]]; then
305
+ port="$((EXTERNAL_ACCESS_PORT + POD_ID))"
306
+ else
307
+ port="$EXTERNAL_ACCESS_PORT"
308
+ fi
309
+ elif [[ -n "${EXTERNAL_ACCESS_PORTS_LIST:-}" ]]; then
310
+ read -r -a ports <<<"$(tr ',' ' ' <<<"${EXTERNAL_ACCESS_PORTS_LIST}")"
311
+ port="${ports[$POD_ID]}"
312
+ else
313
+ error "External access port not provided"
314
+ fi
315
+ # Configure Kafka advertised listeners
316
+ sed -i -E "s|^(advertised\.listeners=\S+)$|\1,EXTERNAL://${host}:${port}|" "$KAFKA_CONFIG_FILE"
317
+ }
318
+ configure_kafka_sasl() {
319
+
320
+ # Replace placeholders with passwords
321
+ replace_placeholder "interbroker-password-placeholder" "$KAFKA_INTER_BROKER_PASSWORD"
322
+ replace_placeholder "controller-password-placeholder" "$KAFKA_CONTROLLER_PASSWORD"
323
+ read -r -a passwords <<<"$(tr ',;' ' ' <<<"${KAFKA_CLIENT_PASSWORDS:-}")"
324
+ for ((i = 0; i < ${#passwords[@]}; i++)); do
325
+ replace_placeholder "password-placeholder-${i}\"" "${passwords[i]}\""
326
+ done
327
+ }
328
+
329
+ export KAFKA_CONFIG_FILE=/config/server.properties
330
+ cp /configmaps/server.properties $KAFKA_CONFIG_FILE
331
+
332
+ # Get pod ID and role, last and second last fields in the pod name respectively
333
+ POD_ID=$(echo "$MY_POD_NAME" | rev | cut -d'-' -f 1 | rev)
334
+ POD_ROLE=$(echo "$MY_POD_NAME" | rev | cut -d'-' -f 2 | rev)
335
+
336
+ # Configure node.id and/or broker.id
337
+ if [[ -f "/bitnami/kafka/data/meta.properties" ]]; then
338
+ if grep -q "broker.id" /bitnami/kafka/data/meta.properties; then
339
+ ID="$(grep "broker.id" /bitnami/kafka/data/meta.properties | awk -F '=' '{print $2}')"
340
+ kafka_conf_set "$KAFKA_CONFIG_FILE" "node.id" "$ID"
341
+ else
342
+ ID="$(grep "node.id" /bitnami/kafka/data/meta.properties | awk -F '=' '{print $2}')"
343
+ kafka_conf_set "$KAFKA_CONFIG_FILE" "node.id" "$ID"
344
+ fi
345
+ else
346
+ ID=$((POD_ID + KAFKA_MIN_ID))
347
+ kafka_conf_set "$KAFKA_CONFIG_FILE" "node.id" "$ID"
348
+ fi
349
+ replace_placeholder "advertised-address-placeholder" "${MY_POD_NAME}.turboscale-kafka-${POD_ROLE}-headless.<HubHaNameSpace>.svc.cluster.local"
350
+ if [[ "${EXTERNAL_ACCESS_ENABLED:-false}" =~ ^(yes|true)$ ]]; then
351
+ configure_external_access
352
+ fi
353
+ configure_kafka_sasl
354
+ if [ -f /secret-config/server-secret.properties ]; then
355
+ append_file_to_kafka_conf /secret-config/server-secret.properties $KAFKA_CONFIG_FILE
356
+ fi
357
+ ---
358
+ # Source: kafka/templates/controller-eligible/svc-headless.yaml
359
+ apiVersion: v1
360
+ kind: Service
361
+ metadata:
362
+ name: turboscale-kafka-controller-headless
363
+ namespace: <HubHaNameSpace>
364
+ labels:
365
+ app.kubernetes.io/instance: turboscale
366
+ app.kubernetes.io/managed-by: Helm
367
+ app.kubernetes.io/name: kafka
368
+ app.kubernetes.io/version: 3.9.0
369
+ helm.sh/chart: kafka-31.1.1
370
+ app.kubernetes.io/component: controller-eligible
371
+ app.kubernetes.io/part-of: kafka
372
+ spec:
373
+ type: ClusterIP
374
+ clusterIP: None
375
+ publishNotReadyAddresses: true
376
+ ports:
377
+ - name: tcp-interbroker
378
+ port: 9094
379
+ protocol: TCP
380
+ targetPort: interbroker
381
+ - name: tcp-client
382
+ port: 9092
383
+ protocol: TCP
384
+ targetPort: client
385
+ - name: tcp-controller
386
+ protocol: TCP
387
+ port: 9093
388
+ targetPort: controller
389
+ selector:
390
+ app.kubernetes.io/instance: turboscale
391
+ app.kubernetes.io/name: kafka
392
+ app.kubernetes.io/component: controller-eligible
393
+ app.kubernetes.io/part-of: kafka
394
+ ---
395
+ # Source: kafka/templates/svc.yaml
396
+ apiVersion: v1
397
+ kind: Service
398
+ metadata:
399
+ name: turboscale-kafka
400
+ namespace: <HubHaNameSpace>
401
+ labels:
402
+ app.kubernetes.io/instance: turboscale
403
+ app.kubernetes.io/managed-by: Helm
404
+ app.kubernetes.io/name: kafka
405
+ app.kubernetes.io/version: 3.9.0
406
+ helm.sh/chart: kafka-31.1.1
407
+ app.kubernetes.io/component: kafka
408
+ spec:
409
+ type: ClusterIP
410
+ sessionAffinity: None
411
+ ports:
412
+ - name: tcp-client
413
+ port: 9092
414
+ protocol: TCP
415
+ targetPort: client
416
+ nodePort: null
417
+ selector:
418
+ app.kubernetes.io/instance: turboscale
419
+ app.kubernetes.io/name: kafka
420
+ app.kubernetes.io/part-of: kafka
421
+ ---
422
+ # Source: kafka/templates/controller-eligible/statefulset.yaml
423
+ apiVersion: apps/v1
424
+ kind: StatefulSet
425
+ metadata:
426
+ name: turboscale-kafka-controller
427
+ namespace: <HubHaNameSpace>
428
+ labels:
429
+ app.kubernetes.io/instance: turboscale
430
+ app.kubernetes.io/managed-by: Helm
431
+ app.kubernetes.io/name: kafka
432
+ app.kubernetes.io/version: 3.9.0
433
+ helm.sh/chart: kafka-31.1.1
434
+ app.kubernetes.io/component: controller-eligible
435
+ app.kubernetes.io/part-of: kafka
436
+ spec:
437
+ podManagementPolicy: Parallel
438
+ replicas: 3
439
+ selector:
440
+ matchLabels:
441
+ app.kubernetes.io/instance: turboscale
442
+ app.kubernetes.io/name: kafka
443
+ app.kubernetes.io/component: controller-eligible
444
+ app.kubernetes.io/part-of: kafka
445
+ serviceName: turboscale-kafka-controller-headless
446
+ updateStrategy:
447
+ type: RollingUpdate
448
+ template:
449
+ metadata:
450
+ labels:
451
+ app.kubernetes.io/instance: turboscale
452
+ app.kubernetes.io/managed-by: Helm
453
+ app.kubernetes.io/name: kafka
454
+ app.kubernetes.io/version: 3.9.0
455
+ helm.sh/chart: kafka-31.1.1
456
+ app.kubernetes.io/component: controller-eligible
457
+ app.kubernetes.io/part-of: kafka
458
+ annotations:
459
+ checksum/configuration: c7c38f47abfba54c4e2836e1d75143a4696d557a752af1769f3fbf56cbf450a0
460
+ checksum/passwords-secret: 718400f1f09d898e17af6d52022a18cbd32ad0ae895b8f282ff05e5c0f663e37
461
+ "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"
462
+ spec:
463
+
464
+ automountServiceAccountToken: false
465
+ hostNetwork: false
466
+ hostIPC: false
467
+ affinity:
468
+ podAffinity:
469
+
470
+ podAntiAffinity:
471
+ preferredDuringSchedulingIgnoredDuringExecution:
472
+ - podAffinityTerm:
473
+ labelSelector:
474
+ matchLabels:
475
+ app.kubernetes.io/instance: turboscale
476
+ app.kubernetes.io/name: kafka
477
+ app.kubernetes.io/component: controller-eligible
478
+ topologyKey: kubernetes.io/hostname
479
+ weight: 1
480
+ nodeAffinity:
481
+
482
+ securityContext:
483
+ fsGroup: 1001
484
+ fsGroupChangePolicy: Always
485
+ seccompProfile:
486
+ type: RuntimeDefault
487
+ supplementalGroups: []
488
+ sysctls: []
489
+ serviceAccountName: turboscale-kafka
490
+ enableServiceLinks: true
491
+ initContainers:
492
+ - name: volume-permissions
493
+ image: public.ecr.aws/v4a1k5d3/browserstack/turboscale-kafka-uploader:osshell_12-debian-12-r34
494
+ imagePullPolicy: "IfNotPresent"
495
+ command:
496
+ - /bin/bash
497
+ args:
498
+ - -ec
499
+ - |
500
+ mkdir -p "/bitnami/kafka" "/opt/bitnami/kafka/logs"
501
+ mkdir -p "/bitnami/kafka/config"
502
+ mkdir -p "/bitnami/kafka/data"
503
+ securityContext:
504
+ runAsUser: 1001
505
+ seLinuxOptions: {}
506
+ resources:
507
+ limits:
508
+ cpu: 150m
509
+ ephemeral-storage: 2Gi
510
+ memory: 192Mi
511
+ requests:
512
+ cpu: 100m
513
+ ephemeral-storage: 50Mi
514
+ memory: 128Mi
515
+ volumeMounts:
516
+ - name: data
517
+ mountPath: /bitnami/kafka
518
+ - name: logs
519
+ mountPath: /opt/bitnami/kafka/logs
520
+ - name: kafka-init
521
+ image: public.ecr.aws/v4a1k5d3/browserstack/turboscale-kafka-uploader:kafka_3.9.0-debian-12-r4
522
+ imagePullPolicy: IfNotPresent
523
+ securityContext:
524
+ allowPrivilegeEscalation: false
525
+ capabilities:
526
+ drop:
527
+ - ALL
528
+ readOnlyRootFilesystem: true
529
+ runAsGroup: 1001
530
+ runAsNonRoot: true
531
+ runAsUser: 1001
532
+ seLinuxOptions: {}
533
+ resources:
534
+ limits: {}
535
+ requests: {}
536
+ command:
537
+ - /bin/bash
538
+ args:
539
+ - -ec
540
+ - |
541
+ /scripts/kafka-init.sh
542
+ env:
543
+ - name: BITNAMI_DEBUG
544
+ value: "false"
545
+ - name: MY_POD_NAME
546
+ valueFrom:
547
+ fieldRef:
548
+ fieldPath: metadata.name
549
+ - name: KAFKA_VOLUME_DIR
550
+ value: "/bitnami/kafka"
551
+ - name: KAFKA_MIN_ID
552
+ value: "0"
553
+ - name: KAFKA_CLIENT_USERS
554
+ value: "user1"
555
+ - name: KAFKA_CLIENT_PASSWORDS
556
+ valueFrom:
557
+ secretKeyRef:
558
+ name: browserstack-secret
559
+ key: kafka-password
560
+ - name: KAFKA_INTER_BROKER_USER
561
+ value: "inter_broker_user"
562
+ - name: KAFKA_INTER_BROKER_PASSWORD
563
+ valueFrom:
564
+ secretKeyRef:
565
+ name: turboscale-kafka-user-passwords
566
+ key: inter-broker-password
567
+ - name: KAFKA_CONTROLLER_USER
568
+ value: "controller_user"
569
+ - name: KAFKA_CONTROLLER_PASSWORD
570
+ valueFrom:
571
+ secretKeyRef:
572
+ name: turboscale-kafka-user-passwords
573
+ key: controller-password
574
+ volumeMounts:
575
+ - name: data
576
+ mountPath: /bitnami/kafka
577
+ - name: kafka-config
578
+ mountPath: /config
579
+ - name: kafka-configmaps
580
+ mountPath: /configmaps
581
+ - name: kafka-secret-config
582
+ mountPath: /secret-config
583
+ - name: scripts
584
+ mountPath: /scripts
585
+ - name: tmp
586
+ mountPath: /tmp
587
+ containers:
588
+ - name: kafka
589
+ image: public.ecr.aws/v4a1k5d3/browserstack/turboscale-kafka-uploader:kafka_3.9.0-debian-12-r4
590
+ imagePullPolicy: "IfNotPresent"
591
+ securityContext:
592
+ allowPrivilegeEscalation: false
593
+ capabilities:
594
+ drop:
595
+ - ALL
596
+ readOnlyRootFilesystem: true
597
+ runAsGroup: 1001
598
+ runAsNonRoot: true
599
+ runAsUser: 1001
600
+ seLinuxOptions: {}
601
+ env:
602
+ - name: BITNAMI_DEBUG
603
+ value: "false"
604
+ - name: KAFKA_HEAP_OPTS
605
+ value: "-XX:InitialRAMPercentage=75 -XX:MaxRAMPercentage=75"
606
+ - name: KAFKA_KRAFT_CLUSTER_ID
607
+ valueFrom:
608
+ secretKeyRef:
609
+ name: turboscale-kafka-kraft-cluster-id
610
+ key: kraft-cluster-id
611
+ - name: KAFKA_KRAFT_BOOTSTRAP_SCRAM_USERS
612
+ value: "true"
613
+ - name: KAFKA_CLIENT_USERS
614
+ value: "user1"
615
+ - name: KAFKA_CLIENT_PASSWORDS
616
+ valueFrom:
617
+ secretKeyRef:
618
+ name: browserstack-secret
619
+ key: kafka-password
620
+ - name: KAFKA_INTER_BROKER_USER
621
+ value: "inter_broker_user"
622
+ - name: KAFKA_INTER_BROKER_PASSWORD
623
+ valueFrom:
624
+ secretKeyRef:
625
+ name: turboscale-kafka-user-passwords
626
+ key: inter-broker-password
627
+ - name: KAFKA_CONTROLLER_USER
628
+ value: "controller_user"
629
+ - name: KAFKA_CONTROLLER_PASSWORD
630
+ valueFrom:
631
+ secretKeyRef:
632
+ name: turboscale-kafka-user-passwords
633
+ key: controller-password
634
+ ports:
635
+ - name: controller
636
+ containerPort: 9093
637
+ - name: client
638
+ containerPort: 9092
639
+ - name: interbroker
640
+ containerPort: 9094
641
+ livenessProbe:
642
+ failureThreshold: 3
643
+ initialDelaySeconds: 10
644
+ periodSeconds: 10
645
+ successThreshold: 1
646
+ timeoutSeconds: 5
647
+ exec:
648
+ command:
649
+ - pgrep
650
+ - -f
651
+ - kafka
652
+ readinessProbe:
653
+ failureThreshold: 6
654
+ initialDelaySeconds: 5
655
+ periodSeconds: 10
656
+ successThreshold: 1
657
+ timeoutSeconds: 5
658
+ tcpSocket:
659
+ port: "controller"
660
+ resources:
661
+ resources:
662
+ limits:
663
+ cpu: 750m
664
+ ephemeral-storage: 2Gi
665
+ memory: 768Mi
666
+ requests:
667
+ cpu: 500m
668
+ ephemeral-storage: 50Mi
669
+ memory: 512Mi
670
+ volumeMounts:
671
+ - name: data
672
+ mountPath: /bitnami/kafka
673
+ - name: logs
674
+ mountPath: /opt/bitnami/kafka/logs
675
+ - name: kafka-config
676
+ mountPath: /opt/bitnami/kafka/config/server.properties
677
+ subPath: server.properties
678
+ - name: tmp
679
+ mountPath: /tmp
680
+ nodeSelector:
681
+ kubernetes.io/os: linux
682
+ volumes:
683
+ - name: kafka-configmaps
684
+ configMap:
685
+ name: turboscale-kafka-controller-configuration
686
+ - name: kafka-secret-config
687
+ emptyDir: {}
688
+ - name: kafka-config
689
+ emptyDir: {}
690
+ - name: tmp
691
+ emptyDir: {}
692
+ - name: scripts
693
+ configMap:
694
+ name: turboscale-kafka-scripts
695
+ defaultMode: 493
696
+ - name: logs
697
+ emptyDir: {}
698
+ volumeClaimTemplates:
699
+ - apiVersion: v1
700
+ kind: PersistentVolumeClaim
701
+ metadata:
702
+ name: data
703
+ spec:
704
+ storageClassName: <StorageClassName>
705
+ accessModes:
706
+ - ReadWriteOnce
707
+ resources:
708
+ limits:
709
+ storage: 10Gi
710
+ requests:
711
+ storage: 5Gi