browserstack-node-sdk 1.34.36 → 1.34.37

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,1048 @@
1
+ ---
2
+ # Source: redis/templates/networkpolicy.yaml
3
+ kind: NetworkPolicy
4
+ apiVersion: networking.k8s.io/v1
5
+ metadata:
6
+ name: turboscale-redis
7
+ namespace: <HubHaNameSpace>
8
+ labels:
9
+ app.kubernetes.io/instance: turboscale
10
+ app.kubernetes.io/managed-by: Helm
11
+ app.kubernetes.io/name: redis
12
+ app.kubernetes.io/version: 7.4.1
13
+ helm.sh/chart: redis-20.6.1
14
+ spec:
15
+ podSelector:
16
+ matchLabels:
17
+ app.kubernetes.io/instance: turboscale
18
+ app.kubernetes.io/name: redis
19
+ policyTypes:
20
+ - Ingress
21
+ - Egress
22
+ egress:
23
+ - {}
24
+ ingress:
25
+ # Allow inbound connections
26
+ - ports:
27
+ - port: 6379
28
+ - port: 26379
29
+ ---
30
+ # Source: redis/templates/sentinel/pdb.yaml
31
+ apiVersion: policy/v1
32
+ kind: PodDisruptionBudget
33
+ metadata:
34
+ name: turboscale-redis-node
35
+ namespace: <HubHaNameSpace>
36
+ labels:
37
+ app.kubernetes.io/instance: turboscale
38
+ app.kubernetes.io/managed-by: Helm
39
+ app.kubernetes.io/name: redis
40
+ app.kubernetes.io/version: 7.4.1
41
+ helm.sh/chart: redis-20.6.1
42
+ app.kubernetes.io/component: node
43
+ spec:
44
+ maxUnavailable: 1
45
+ selector:
46
+ matchLabels:
47
+ app.kubernetes.io/instance: turboscale
48
+ app.kubernetes.io/name: redis
49
+ app.kubernetes.io/component: node
50
+ ---
51
+ # Source: redis/templates/serviceaccount.yaml
52
+ apiVersion: v1
53
+ kind: ServiceAccount
54
+ automountServiceAccountToken: false
55
+ metadata:
56
+ name: turboscale-redis
57
+ namespace: <HubHaNameSpace>
58
+ labels:
59
+ app.kubernetes.io/instance: turboscale
60
+ app.kubernetes.io/managed-by: Helm
61
+ app.kubernetes.io/name: redis
62
+ app.kubernetes.io/version: 7.4.1
63
+ helm.sh/chart: redis-20.6.1
64
+ ---
65
+ # Source: redis/templates/configmap.yaml
66
+ apiVersion: v1
67
+ kind: ConfigMap
68
+ metadata:
69
+ name: turboscale-redis-configuration
70
+ namespace: <HubHaNameSpace>
71
+ labels:
72
+ app.kubernetes.io/instance: turboscale
73
+ app.kubernetes.io/managed-by: Helm
74
+ app.kubernetes.io/name: redis
75
+ app.kubernetes.io/version: 7.4.1
76
+ helm.sh/chart: redis-20.6.1
77
+ data:
78
+ redis.conf: |-
79
+ # User-supplied common configuration:
80
+ # Enable AOF https://redis.io/topics/persistence#append-only-file
81
+ appendonly yes
82
+ # Disable RDB persistence, AOF persistence already enabled.
83
+ save ""
84
+ # End of common configuration
85
+ master.conf: |-
86
+ dir /data
87
+ # User-supplied master configuration:
88
+ rename-command FLUSHDB ""
89
+ rename-command FLUSHALL ""
90
+ # End of master configuration
91
+ replica.conf: |-
92
+ dir /data
93
+ # User-supplied replica configuration:
94
+ rename-command FLUSHDB ""
95
+ rename-command FLUSHALL ""
96
+ # End of replica configuration
97
+ sentinel.conf: |-
98
+ dir "/tmp"
99
+ port 26379
100
+ sentinel monitor mymaster turboscale-redis.<HubHaNameSpace>.svc.cluster.local 6379 2
101
+ sentinel down-after-milliseconds mymaster 60000
102
+ sentinel resolve-hostnames yes
103
+ sentinel failover-timeout mymaster 180000
104
+ sentinel parallel-syncs mymaster 1
105
+ # User-supplied sentinel configuration:
106
+ # End of sentinel configuration
107
+ ---
108
+ # Source: redis/templates/health-configmap.yaml
109
+ apiVersion: v1
110
+ kind: ConfigMap
111
+ metadata:
112
+ name: turboscale-redis-health
113
+ namespace: <HubHaNameSpace>
114
+ labels:
115
+ app.kubernetes.io/instance: turboscale
116
+ app.kubernetes.io/managed-by: Helm
117
+ app.kubernetes.io/name: redis
118
+ app.kubernetes.io/version: 7.4.1
119
+ helm.sh/chart: redis-20.6.1
120
+ data:
121
+ ping_readiness_local.sh: |-
122
+ #!/bin/bash
123
+
124
+ [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")"
125
+ [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD"
126
+ response=$(
127
+ timeout -s 15 $1 \
128
+ redis-cli \
129
+ -h localhost \
130
+ -p $REDIS_PORT \
131
+ ping
132
+ )
133
+ if [ "$?" -eq "124" ]; then
134
+ echo "Timed out"
135
+ exit 1
136
+ fi
137
+ if [ "$response" != "PONG" ]; then
138
+ echo "$response"
139
+ exit 1
140
+ fi
141
+ ping_liveness_local.sh: |-
142
+ #!/bin/bash
143
+
144
+ [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")"
145
+ [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD"
146
+ response=$(
147
+ timeout -s 15 $1 \
148
+ redis-cli \
149
+ -h localhost \
150
+ -p $REDIS_PORT \
151
+ ping
152
+ )
153
+ if [ "$?" -eq "124" ]; then
154
+ echo "Timed out"
155
+ exit 1
156
+ fi
157
+ responseFirstWord=$(echo $response | head -n1 | awk '{print $1;}')
158
+ if [ "$response" != "PONG" ] && [ "$responseFirstWord" != "LOADING" ] && [ "$responseFirstWord" != "MASTERDOWN" ]; then
159
+ echo "$response"
160
+ exit 1
161
+ fi
162
+ ping_sentinel.sh: |-
163
+ #!/bin/bash
164
+ [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")"
165
+ [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD"
166
+ response=$(
167
+ timeout -s 15 $1 \
168
+ redis-cli \
169
+ -h localhost \
170
+ -p $REDIS_SENTINEL_PORT \
171
+ ping
172
+ )
173
+ if [ "$?" -eq "124" ]; then
174
+ echo "Timed out"
175
+ exit 1
176
+ fi
177
+ if [ "$response" != "PONG" ]; then
178
+ echo "$response"
179
+ exit 1
180
+ fi
181
+ parse_sentinels.awk: |-
182
+ /ip/ {FOUND_IP=1}
183
+ /port/ {FOUND_PORT=1}
184
+ /runid/ {FOUND_RUNID=1}
185
+ !/ip|port|runid/ {
186
+ if (FOUND_IP==1) {
187
+ IP=$1; FOUND_IP=0;
188
+ }
189
+ else if (FOUND_PORT==1) {
190
+ PORT=$1;
191
+ FOUND_PORT=0;
192
+ } else if (FOUND_RUNID==1) {
193
+ printf "\nsentinel known-sentinel mymaster %s %s %s", IP, PORT, $0; FOUND_RUNID=0;
194
+ }
195
+ }
196
+ ping_readiness_master.sh: |-
197
+ #!/bin/bash
198
+
199
+ [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")"
200
+ [[ -n "$REDIS_MASTER_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_MASTER_PASSWORD"
201
+ response=$(
202
+ timeout -s 15 $1 \
203
+ redis-cli \
204
+ -h $REDIS_MASTER_HOST \
205
+ -p $REDIS_MASTER_PORT_NUMBER \
206
+ ping
207
+ )
208
+ if [ "$?" -eq "124" ]; then
209
+ echo "Timed out"
210
+ exit 1
211
+ fi
212
+ if [ "$response" != "PONG" ]; then
213
+ echo "$response"
214
+ exit 1
215
+ fi
216
+ ping_liveness_master.sh: |-
217
+ #!/bin/bash
218
+
219
+ [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")"
220
+ [[ -n "$REDIS_MASTER_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_MASTER_PASSWORD"
221
+ response=$(
222
+ timeout -s 15 $1 \
223
+ redis-cli \
224
+ -h $REDIS_MASTER_HOST \
225
+ -p $REDIS_MASTER_PORT_NUMBER \
226
+ ping
227
+ )
228
+ if [ "$?" -eq "124" ]; then
229
+ echo "Timed out"
230
+ exit 1
231
+ fi
232
+ responseFirstWord=$(echo $response | head -n1 | awk '{print $1;}')
233
+ if [ "$response" != "PONG" ] && [ "$responseFirstWord" != "LOADING" ]; then
234
+ echo "$response"
235
+ exit 1
236
+ fi
237
+ ping_readiness_local_and_master.sh: |-
238
+ script_dir="$(dirname "$0")"
239
+ exit_status=0
240
+ "$script_dir/ping_readiness_local.sh" $1 || exit_status=$?
241
+ "$script_dir/ping_readiness_master.sh" $1 || exit_status=$?
242
+ exit $exit_status
243
+ ping_liveness_local_and_master.sh: |-
244
+ script_dir="$(dirname "$0")"
245
+ exit_status=0
246
+ "$script_dir/ping_liveness_local.sh" $1 || exit_status=$?
247
+ "$script_dir/ping_liveness_master.sh" $1 || exit_status=$?
248
+ exit $exit_status
249
+ ---
250
+ # Source: redis/templates/scripts-configmap.yaml
251
+ apiVersion: v1
252
+ kind: ConfigMap
253
+ metadata:
254
+ name: turboscale-redis-scripts
255
+ namespace: <HubHaNameSpace>
256
+ labels:
257
+ app.kubernetes.io/instance: turboscale
258
+ app.kubernetes.io/managed-by: Helm
259
+ app.kubernetes.io/name: redis
260
+ app.kubernetes.io/version: 7.4.1
261
+ helm.sh/chart: redis-20.6.1
262
+ data:
263
+ start-node.sh: |
264
+ #!/bin/bash
265
+
266
+ . /opt/bitnami/scripts/libos.sh
267
+ . /opt/bitnami/scripts/liblog.sh
268
+ . /opt/bitnami/scripts/libvalidations.sh
269
+
270
+ get_port() {
271
+ hostname="$1"
272
+ type="$2"
273
+
274
+ port_var=$(echo "${hostname^^}_SERVICE_PORT_$type" | sed "s/-/_/g")
275
+ port=${!port_var}
276
+
277
+ if [ -z "$port" ]; then
278
+ case $type in
279
+ "SENTINEL")
280
+ echo 26379
281
+ ;;
282
+ "REDIS")
283
+ echo 6379
284
+ ;;
285
+ esac
286
+ else
287
+ echo $port
288
+ fi
289
+ }
290
+
291
+ get_full_hostname() {
292
+ hostname="$1"
293
+ full_hostname="${hostname}.${HEADLESS_SERVICE}"
294
+ echo "${full_hostname}"
295
+ }
296
+
297
+ REDISPORT=$(get_port "$HOSTNAME" "REDIS")
298
+
299
+ HEADLESS_SERVICE="turboscale-redis-headless.<HubHaNameSpace>.svc.cluster.local"
300
+
301
+ if [ -n "$REDIS_EXTERNAL_MASTER_HOST" ]; then
302
+ REDIS_SERVICE="$REDIS_EXTERNAL_MASTER_HOST"
303
+ else
304
+ REDIS_SERVICE="turboscale-redis.<HubHaNameSpace>.svc.cluster.local"
305
+ fi
306
+
307
+ SENTINEL_SERVICE_PORT=$(get_port "turboscale-redis" "SENTINEL")
308
+
309
+ redis_cli_command() {
310
+ local timeout="${1:-0}"
311
+
312
+ local args=("-h" "$REDIS_SERVICE" "-p" "$SENTINEL_SERVICE_PORT")
313
+ local command="redis-cli"
314
+ if is_boolean_yes "$REDIS_TLS_ENABLED"; then
315
+ args+=("--tls" "--cert" "$REDIS_TLS_CERT_FILE" "--key" "$REDIS_TLS_KEY_FILE")
316
+ [ -n "$REDIS_TLS_CA_FILE" ] && args+=("--cacert" "$REDIS_TLS_CA_FILE")
317
+ fi
318
+ if [ "$timeout" -gt 0 ]; then
319
+ command="timeout $timeout $command"
320
+ fi
321
+
322
+ echo "REDISCLI_AUTH="\$REDIS_PASSWORD" $command ${args[*]}"
323
+ }
324
+
325
+ validate_quorum() {
326
+ quorum_info_command="$(redis_cli_command) sentinel master mymaster"
327
+ info "about to run the command: $quorum_info_command"
328
+ eval $quorum_info_command | grep -Fq "s_down"
329
+ }
330
+
331
+ trigger_manual_failover() {
332
+ failover_command="$(redis_cli_command) sentinel failover mymaster"
333
+ info "about to run the command: $failover_command"
334
+ eval $failover_command
335
+ }
336
+
337
+ get_sentinel_master_info() {
338
+ sentinel_info_command="$(redis_cli_command 90) sentinel get-master-addr-by-name mymaster"
339
+ info "about to run the command: $sentinel_info_command"
340
+ retry_while "eval $sentinel_info_command" 2 5
341
+ }
342
+
343
+ [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")"
344
+ [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")"
345
+
346
+ # check if there is a master
347
+ master_in_persisted_conf="$(get_full_hostname "$HOSTNAME")"
348
+ master_port_in_persisted_conf="$REDIS_MASTER_PORT_NUMBER"
349
+ master_in_sentinel="$(get_sentinel_master_info)"
350
+ redisRetVal=$?
351
+
352
+ if [[ -f /opt/bitnami/redis-sentinel/etc/sentinel.conf ]]; then
353
+ master_in_persisted_conf="$(awk '/monitor/ {print $4}' /opt/bitnami/redis-sentinel/etc/sentinel.conf)"
354
+ master_port_in_persisted_conf="$(awk '/monitor/ {print $5}' /opt/bitnami/redis-sentinel/etc/sentinel.conf)"
355
+ info "Found previous master ${master_in_persisted_conf}:${master_port_in_persisted_conf} in /opt/bitnami/redis-sentinel/etc/sentinel.conf"
356
+ debug "$(cat /opt/bitnami/redis-sentinel/etc/sentinel.conf | grep monitor)"
357
+ fi
358
+
359
+ if [[ $redisRetVal -ne 0 ]]; then
360
+ if [[ "$master_in_persisted_conf" == "$(get_full_hostname "$HOSTNAME")" ]]; then
361
+ # Case 1: No active sentinel and in previous sentinel.conf we were the master --> MASTER
362
+ info "Configuring the node as master"
363
+ export REDIS_REPLICATION_MODE="master"
364
+ else
365
+ # Case 2: No active sentinel and in previous sentinel.conf we were not master --> REPLICA
366
+ info "Configuring the node as replica"
367
+ export REDIS_REPLICATION_MODE="replica"
368
+ REDIS_MASTER_HOST=${master_in_persisted_conf}
369
+ REDIS_MASTER_PORT_NUMBER=${master_port_in_persisted_conf}
370
+ fi
371
+ else
372
+ # Fetches current master's host and port
373
+ REDIS_SENTINEL_INFO=($(get_sentinel_master_info))
374
+ info "Current master: REDIS_SENTINEL_INFO=(${REDIS_SENTINEL_INFO[0]},${REDIS_SENTINEL_INFO[1]})"
375
+ REDIS_MASTER_HOST=${REDIS_SENTINEL_INFO[0]}
376
+ REDIS_MASTER_PORT_NUMBER=${REDIS_SENTINEL_INFO[1]}
377
+
378
+ if [[ "$REDIS_MASTER_HOST" == "$(get_full_hostname "$HOSTNAME")" ]]; then
379
+ # Case 3: Active sentinel and master it is this node --> MASTER
380
+ info "Configuring the node as master"
381
+ export REDIS_REPLICATION_MODE="master"
382
+ else
383
+ # Case 4: Active sentinel and master is not this node --> REPLICA
384
+ info "Configuring the node as replica"
385
+ export REDIS_REPLICATION_MODE="replica"
386
+ fi
387
+ fi
388
+
389
+ if [[ -n "$REDIS_EXTERNAL_MASTER_HOST" ]]; then
390
+ REDIS_MASTER_HOST="$REDIS_EXTERNAL_MASTER_HOST"
391
+ REDIS_MASTER_PORT_NUMBER="${REDIS_EXTERNAL_MASTER_PORT}"
392
+ fi
393
+
394
+ if [[ -f /opt/bitnami/redis/mounted-etc/replica.conf ]];then
395
+ cp /opt/bitnami/redis/mounted-etc/replica.conf /opt/bitnami/redis/etc/replica.conf
396
+ fi
397
+
398
+ if [[ -f /opt/bitnami/redis/mounted-etc/redis.conf ]];then
399
+ cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf
400
+ fi
401
+
402
+ echo "" >> /opt/bitnami/redis/etc/replica.conf
403
+ echo "replica-announce-port $REDISPORT" >> /opt/bitnami/redis/etc/replica.conf
404
+ echo "replica-announce-ip $(get_full_hostname "$HOSTNAME")" >> /opt/bitnami/redis/etc/replica.conf
405
+ ARGS=("--port" "${REDIS_PORT}")
406
+
407
+ if [[ "$REDIS_REPLICATION_MODE" = "slave" ]] || [[ "$REDIS_REPLICATION_MODE" = "replica" ]]; then
408
+ ARGS+=("--replicaof" "${REDIS_MASTER_HOST}" "${REDIS_MASTER_PORT_NUMBER}")
409
+ fi
410
+ ARGS+=("--requirepass" "${REDIS_PASSWORD}")
411
+ ARGS+=("--masterauth" "${REDIS_MASTER_PASSWORD}")
412
+ ARGS+=("--include" "/opt/bitnami/redis/etc/replica.conf")
413
+ ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf")
414
+ exec redis-server "${ARGS[@]}"
415
+
416
+ start-sentinel.sh: |
417
+ #!/bin/bash
418
+
419
+ . /opt/bitnami/scripts/libos.sh
420
+ . /opt/bitnami/scripts/libvalidations.sh
421
+ . /opt/bitnami/scripts/libfile.sh
422
+
423
+ HEADLESS_SERVICE="turboscale-redis-headless.<HubHaNameSpace>.svc.cluster.local"
424
+ REDIS_SERVICE="turboscale-redis.<HubHaNameSpace>.svc.cluster.local"
425
+
426
+ get_port() {
427
+ hostname="$1"
428
+ type="$2"
429
+
430
+ port_var=$(echo "${hostname^^}_SERVICE_PORT_$type" | sed "s/-/_/g")
431
+ port=${!port_var}
432
+
433
+ if [ -z "$port" ]; then
434
+ case $type in
435
+ "SENTINEL")
436
+ echo 26379
437
+ ;;
438
+ "REDIS")
439
+ echo 6379
440
+ ;;
441
+ esac
442
+ else
443
+ echo $port
444
+ fi
445
+ }
446
+
447
+ get_full_hostname() {
448
+ hostname="$1"
449
+ full_hostname="${hostname}.${HEADLESS_SERVICE}"
450
+ echo "${full_hostname}"
451
+ }
452
+
453
+ SERVPORT=$(get_port "$HOSTNAME" "SENTINEL")
454
+ REDISPORT=$(get_port "$HOSTNAME" "REDIS")
455
+ SENTINEL_SERVICE_PORT=$(get_port "turboscale-redis" "SENTINEL")
456
+
457
+ sentinel_conf_set() {
458
+ local -r key="${1:?missing key}"
459
+ local value="${2:-}"
460
+
461
+ # Sanitize inputs
462
+ value="${value//\\/\\\\}"
463
+ value="${value//&/\\&}"
464
+ value="${value//\?/\\?}"
465
+ [[ "$value" = "" ]] && value="\"$value\""
466
+
467
+ replace_in_file "/opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf" "^#*\s*${key} .*" "${key} ${value}" false
468
+ }
469
+ sentinel_conf_add() {
470
+ echo $'\n'"$@" >> "/opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf"
471
+ }
472
+ host_id() {
473
+ echo "$1" | openssl sha1 | awk '{print $2}'
474
+ }
475
+ get_sentinel_master_info() {
476
+ if is_boolean_yes "$REDIS_SENTINEL_TLS_ENABLED"; then
477
+ sentinel_info_command="REDISCLI_AUTH="\$REDIS_PASSWORD" timeout 90 redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT --tls --cert ${REDIS_SENTINEL_TLS_CERT_FILE} --key ${REDIS_SENTINEL_TLS_KEY_FILE} --cacert ${REDIS_SENTINEL_TLS_CA_FILE} sentinel get-master-addr-by-name mymaster"
478
+ else
479
+ sentinel_info_command="REDISCLI_AUTH="\$REDIS_PASSWORD" timeout 90 redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT sentinel get-master-addr-by-name mymaster"
480
+ fi
481
+ info "about to run the command: $sentinel_info_command"
482
+ retry_while "eval $sentinel_info_command" 2 5
483
+ }
484
+
485
+ [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")"
486
+
487
+ master_in_persisted_conf="$(get_full_hostname "$HOSTNAME")"
488
+
489
+ if [[ -f /opt/bitnami/redis-sentinel/etc/sentinel.conf ]]; then
490
+ master_in_persisted_conf="$(awk '/monitor/ {print $4}' /opt/bitnami/redis-sentinel/etc/sentinel.conf)"
491
+ info "Found previous master $master_in_persisted_conf in /opt/bitnami/redis-sentinel/etc/sentinel.conf"
492
+ debug "$(cat /opt/bitnami/redis-sentinel/etc/sentinel.conf | grep monitor)"
493
+ fi
494
+ REDIS_SENTINEL_INFO=($(get_sentinel_master_info))
495
+ if [ "$?" -eq "0" ]; then
496
+ # current master's host and port obtained from other Sentinel
497
+ info "printing REDIS_SENTINEL_INFO=(${REDIS_SENTINEL_INFO[0]},${REDIS_SENTINEL_INFO[1]})"
498
+ REDIS_MASTER_HOST=${REDIS_SENTINEL_INFO[0]}
499
+ REDIS_MASTER_PORT_NUMBER=${REDIS_SENTINEL_INFO[1]}
500
+ else
501
+ REDIS_MASTER_HOST="$master_in_persisted_conf"
502
+ REDIS_MASTER_PORT_NUMBER="$REDISPORT"
503
+ fi
504
+ if [[ "$REDIS_MASTER_HOST" == "$(get_full_hostname "$HOSTNAME")" ]]; then
505
+ export REDIS_REPLICATION_MODE="master"
506
+ else
507
+ export REDIS_REPLICATION_MODE="replica"
508
+ fi
509
+
510
+ if [[ -n "$REDIS_EXTERNAL_MASTER_HOST" ]]; then
511
+ REDIS_MASTER_HOST="$REDIS_EXTERNAL_MASTER_HOST"
512
+ REDIS_MASTER_PORT_NUMBER="${REDIS_EXTERNAL_MASTER_PORT}"
513
+ fi
514
+
515
+ # To prevent incomplete configuration and as the redis container accesses /opt/bitnami/redis-sentinel/etc/sentinel.conf
516
+ # as well, prepare the new config in `prepare-sentinel.conf` and move it atomically to the ultimate destination when it is complete.
517
+ cp /opt/bitnami/redis-sentinel/mounted-etc/sentinel.conf /opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf
518
+ printf "\nsentinel auth-pass %s %s" "mymaster" "$REDIS_PASSWORD" >> /opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf
519
+ printf "\nrequirepass %s" "$REDIS_PASSWORD" >> /opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf
520
+ printf "\nsentinel myid %s" "$(host_id "$HOSTNAME")" >> /opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf
521
+
522
+ if [[ -z "$REDIS_MASTER_HOST" ]] || [[ -z "$REDIS_MASTER_PORT_NUMBER" ]]
523
+ then
524
+ # Prevent incorrect configuration to be written to sentinel.conf
525
+ error "Redis master host is configured incorrectly (host: $REDIS_MASTER_HOST, port: $REDIS_MASTER_PORT_NUMBER)"
526
+ exit 1
527
+ fi
528
+
529
+ sentinel_conf_set "sentinel monitor" "mymaster "$REDIS_MASTER_HOST" "$REDIS_MASTER_PORT_NUMBER" 2"
530
+ sentinel_conf_add "sentinel resolve-hostnames yes"
531
+
532
+ add_known_sentinel() {
533
+ hostname="$1"
534
+ ip="$2"
535
+
536
+ if [[ -n "$hostname" && -n "$ip" && "$hostname" != "$HOSTNAME" ]]; then
537
+ sentinel_conf_add "sentinel known-sentinel mymaster $(get_full_hostname "$hostname") $(get_port "$hostname" "SENTINEL") $(host_id "$hostname")"
538
+ fi
539
+ }
540
+ add_known_replica() {
541
+ hostname="$1"
542
+ ip="$2"
543
+
544
+ if [[ -n "$ip" && "$(get_full_hostname "$hostname")" != "$REDIS_MASTER_HOST" ]]; then
545
+ sentinel_conf_add "sentinel known-replica mymaster $(get_full_hostname "$hostname") $(get_port "$hostname" "REDIS")"
546
+ fi
547
+ }
548
+
549
+ # Add available hosts on the network as known replicas & sentinels
550
+ for node in $(seq 0 $((3-1))); do
551
+ hostname="turboscale-redis-node-$node"
552
+ ip="$(getent hosts "$hostname.$HEADLESS_SERVICE" | awk '{ print $1 }')"
553
+ add_known_sentinel "$hostname" "$ip"
554
+ add_known_replica "$hostname" "$ip"
555
+ done
556
+
557
+ echo "" >> /opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf
558
+ echo "sentinel announce-hostnames yes" >> /opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf
559
+ echo "sentinel resolve-hostnames yes" >> /opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf
560
+ echo "sentinel announce-port $SERVPORT" >> /opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf
561
+ echo "sentinel announce-ip $(get_full_hostname "$HOSTNAME")" >> /opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf
562
+ mv /opt/bitnami/redis-sentinel/etc/prepare-sentinel.conf /opt/bitnami/redis-sentinel/etc/sentinel.conf
563
+ exec redis-server /opt/bitnami/redis-sentinel/etc/sentinel.conf --sentinel
564
+ prestop-sentinel.sh: |
565
+ #!/bin/bash
566
+
567
+ . /opt/bitnami/scripts/libvalidations.sh
568
+ . /opt/bitnami/scripts/libos.sh
569
+
570
+ HEADLESS_SERVICE="turboscale-redis-headless.<HubHaNameSpace>.svc.cluster.local"
571
+
572
+ get_full_hostname() {
573
+ hostname="$1"
574
+ full_hostname="${hostname}.${HEADLESS_SERVICE}"
575
+ echo "${full_hostname}"
576
+ }
577
+
578
+ run_sentinel_command() {
579
+ if is_boolean_yes "$REDIS_SENTINEL_TLS_ENABLED"; then
580
+ redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_TLS_PORT_NUMBER" --tls --cert "$REDIS_SENTINEL_TLS_CERT_FILE" --key "$REDIS_SENTINEL_TLS_KEY_FILE" --cacert "$REDIS_SENTINEL_TLS_CA_FILE" sentinel "$@"
581
+ else
582
+ redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_PORT" sentinel "$@"
583
+ fi
584
+ }
585
+ sentinel_failover_finished() {
586
+ REDIS_SENTINEL_INFO=($(run_sentinel_command get-master-addr-by-name "mymaster"))
587
+ REDIS_MASTER_HOST="${REDIS_SENTINEL_INFO[0]}"
588
+ [[ "$REDIS_MASTER_HOST" != "$(get_full_hostname $HOSTNAME)" ]]
589
+ }
590
+
591
+ REDIS_SERVICE="turboscale-redis.<HubHaNameSpace>.svc.cluster.local"
592
+
593
+ # redis-cli automatically consumes credentials from the REDISCLI_AUTH variable
594
+ [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD"
595
+ [[ -f "$REDIS_PASSWORD_FILE" ]] && export REDISCLI_AUTH="$(< "${REDIS_PASSWORD_FILE}")"
596
+
597
+ if ! sentinel_failover_finished; then
598
+ echo "I am the master pod and you are stopping me. Starting sentinel failover"
599
+ if retry_while "sentinel_failover_finished" "20" 1; then
600
+ echo "Master has been successfuly failed over to a different pod."
601
+ exit 0
602
+ else
603
+ echo "Master failover failed"
604
+ exit 1
605
+ fi
606
+ else
607
+ exit 0
608
+ fi
609
+ prestop-redis.sh: |
610
+ #!/bin/bash
611
+
612
+ . /opt/bitnami/scripts/libvalidations.sh
613
+ . /opt/bitnami/scripts/libos.sh
614
+
615
+ run_redis_command() {
616
+ local args=("-h" "127.0.0.1")
617
+ if is_boolean_yes "$REDIS_TLS_ENABLED"; then
618
+ args+=("-p" "$REDIS_TLS_PORT" "--tls" "--cert" "$REDIS_TLS_CERT_FILE" "--key" "$REDIS_TLS_KEY_FILE")
619
+ [ -n "$REDIS_TLS_CA_FILE" ] && args+=("--cacert" "$REDIS_TLS_CA_FILE")
620
+ else
621
+ args+=("-p" "$REDIS_PORT")
622
+ fi
623
+ redis-cli "${args[@]}" "$@"
624
+ }
625
+ is_master() {
626
+ REDIS_ROLE=$(run_redis_command role | head -1)
627
+ [[ "$REDIS_ROLE" == "master" ]]
628
+ }
629
+
630
+ HEADLESS_SERVICE="turboscale-redis-headless.<HubHaNameSpace>.svc.cluster.local"
631
+
632
+ get_full_hostname() {
633
+ hostname="$1"
634
+ full_hostname="${hostname}.${HEADLESS_SERVICE}"
635
+ echo "${full_hostname}"
636
+ }
637
+
638
+ run_sentinel_command() {
639
+ if is_boolean_yes "$REDIS_SENTINEL_TLS_ENABLED"; then
640
+ redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_TLS_PORT_NUMBER" --tls --cert "$REDIS_SENTINEL_TLS_CERT_FILE" --key "$REDIS_SENTINEL_TLS_KEY_FILE" --cacert "$REDIS_SENTINEL_TLS_CA_FILE" sentinel "$@"
641
+ else
642
+ redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_PORT" sentinel "$@"
643
+ fi
644
+ }
645
+ sentinel_failover_finished() {
646
+ REDIS_SENTINEL_INFO=($(run_sentinel_command get-master-addr-by-name "mymaster"))
647
+ REDIS_MASTER_HOST="${REDIS_SENTINEL_INFO[0]}"
648
+ [[ "$REDIS_MASTER_HOST" != "$(get_full_hostname $HOSTNAME)" ]]
649
+ }
650
+
651
+ REDIS_SERVICE="turboscale-redis.<HubHaNameSpace>.svc.cluster.local"
652
+
653
+ # redis-cli automatically consumes credentials from the REDISCLI_AUTH variable
654
+ [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD"
655
+ [[ -f "$REDIS_PASSWORD_FILE" ]] && export REDISCLI_AUTH="$(< "${REDIS_PASSWORD_FILE}")"
656
+
657
+
658
+ if is_master && ! sentinel_failover_finished; then
659
+ echo "I am the master pod and you are stopping me. Pausing client connections."
660
+ # Pausing client write connections to avoid data loss
661
+ run_redis_command CLIENT PAUSE "22000" WRITE
662
+
663
+ echo "Issuing failover"
664
+ # if I am the master, issue a command to failover once
665
+ run_sentinel_command failover "mymaster"
666
+ echo "Waiting for sentinel to complete failover for up to 20s"
667
+ retry_while "sentinel_failover_finished" "20" 1
668
+ else
669
+ exit 0
670
+ fi
671
+ ---
672
+ # Source: redis/templates/headless-svc.yaml
673
+ apiVersion: v1
674
+ kind: Service
675
+ metadata:
676
+ name: turboscale-redis-headless
677
+ namespace: <HubHaNameSpace>
678
+ labels:
679
+ app.kubernetes.io/instance: turboscale
680
+ app.kubernetes.io/managed-by: Helm
681
+ app.kubernetes.io/name: redis
682
+ app.kubernetes.io/version: 7.4.1
683
+ helm.sh/chart: redis-20.6.1
684
+ spec:
685
+ type: ClusterIP
686
+ clusterIP: None
687
+ publishNotReadyAddresses: true
688
+ ports:
689
+ - name: tcp-redis
690
+ port: 6379
691
+ targetPort: redis
692
+ - name: tcp-sentinel
693
+ port: 26379
694
+ targetPort: redis-sentinel
695
+ selector:
696
+ app.kubernetes.io/instance: turboscale
697
+ app.kubernetes.io/name: redis
698
+ ---
699
+ # Source: redis/templates/sentinel/service.yaml
700
+ apiVersion: v1
701
+ kind: Service
702
+ metadata:
703
+ name: turboscale-redis
704
+ namespace: <HubHaNameSpace>
705
+ labels:
706
+ app.kubernetes.io/instance: turboscale
707
+ app.kubernetes.io/managed-by: Helm
708
+ app.kubernetes.io/name: redis
709
+ app.kubernetes.io/version: 7.4.1
710
+ helm.sh/chart: redis-20.6.1
711
+ app.kubernetes.io/component: node
712
+ spec:
713
+ type: ClusterIP
714
+ sessionAffinity: None
715
+ ports:
716
+ - name: tcp-redis
717
+ port: 6379
718
+ targetPort: 6379
719
+ nodePort: null
720
+ - name: tcp-sentinel
721
+ port: 26379
722
+ targetPort: 26379
723
+ nodePort: null
724
+ selector:
725
+ app.kubernetes.io/instance: turboscale
726
+ app.kubernetes.io/name: redis
727
+ app.kubernetes.io/component: node
728
+ ---
729
+ # Source: redis/templates/sentinel/statefulset.yaml
730
+ apiVersion: apps/v1
731
+ kind: StatefulSet
732
+ metadata:
733
+ name: turboscale-redis-node
734
+ namespace: <HubHaNameSpace>
735
+ labels:
736
+ app.kubernetes.io/instance: turboscale
737
+ app.kubernetes.io/managed-by: Helm
738
+ app.kubernetes.io/name: redis
739
+ app.kubernetes.io/version: 7.4.1
740
+ helm.sh/chart: redis-20.6.1
741
+ app.kubernetes.io/component: node
742
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "false"
743
+ spec:
744
+ replicas: 3
745
+ revisionHistoryLimit: 10
746
+ selector:
747
+ matchLabels:
748
+ app.kubernetes.io/instance: turboscale
749
+ app.kubernetes.io/name: redis
750
+ app.kubernetes.io/component: node
751
+ serviceName: turboscale-redis-headless
752
+ updateStrategy:
753
+ type: RollingUpdate
754
+ template:
755
+ metadata:
756
+ labels:
757
+ app.kubernetes.io/instance: turboscale
758
+ app.kubernetes.io/managed-by: Helm
759
+ app.kubernetes.io/name: redis
760
+ app.kubernetes.io/version: 7.4.1
761
+ helm.sh/chart: redis-20.6.1
762
+ app.kubernetes.io/component: node
763
+ annotations:
764
+ # checksum/configmap: b9e0d9224bd2abd3ff02f3d37b936ca145274cbb2098345a941898e5093b86d3
765
+ checksun/configmap: 9cca9faa12c4456a87f4bf62979b014d7f434168602b6715f693e8f66ff26bfd
766
+ checksum/health: 1eace71641fb5bd753e90012419e82c10b1180d694f91d83743b727a5aacca73
767
+ # checksum/scripts: fe48872558f2a79b33688c17b93e60dd870db913659952247eb02a8112f28ae4
768
+ # checksum/secret: 59a721b3bcc0ef9196fa2ff07a656b2b693af8b9a053fcb56c62c2770e85bb1f
769
+ checksum/scripts: e76c92ac67e7d72dad0eb764cdf02361844822f1275c5098d1118552955db334
770
+ # checksum/secret: 9d8f8d280dae4b98203bb2dddf76c739a082ec202e076c112ea9f3a315eb3854
771
+ "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"
772
+ spec:
773
+
774
+ automountServiceAccountToken: false
775
+ securityContext:
776
+ fsGroup: 1001
777
+ fsGroupChangePolicy: Always
778
+ supplementalGroups: []
779
+ sysctls: []
780
+ serviceAccountName: turboscale-redis
781
+ affinity:
782
+ podAffinity:
783
+
784
+ podAntiAffinity:
785
+ preferredDuringSchedulingIgnoredDuringExecution:
786
+ - podAffinityTerm:
787
+ labelSelector:
788
+ matchLabels:
789
+ app.kubernetes.io/instance: turboscale
790
+ app.kubernetes.io/name: redis
791
+ app.kubernetes.io/component: node
792
+ topologyKey: kubernetes.io/hostname
793
+ weight: 1
794
+ nodeAffinity:
795
+
796
+ enableServiceLinks: true
797
+ terminationGracePeriodSeconds: 30
798
+ containers:
799
+ - name: redis
800
+ image: public.ecr.aws/v4a1k5d3/browserstack/turboscale-kafka-uploader:redis_7.4.1-debian-12-r3
801
+ imagePullPolicy: "IfNotPresent"
802
+ lifecycle:
803
+ preStop:
804
+ exec:
805
+ command:
806
+ - /bin/bash
807
+ - -c
808
+ - /opt/bitnami/scripts/start-scripts/prestop-redis.sh
809
+ securityContext:
810
+ allowPrivilegeEscalation: false
811
+ capabilities:
812
+ drop:
813
+ - ALL
814
+ readOnlyRootFilesystem: true
815
+ runAsGroup: 1001
816
+ runAsNonRoot: true
817
+ runAsUser: 1001
818
+ seLinuxOptions: {}
819
+ seccompProfile:
820
+ type: RuntimeDefault
821
+ command:
822
+ - /bin/bash
823
+ args:
824
+ - -c
825
+ - /opt/bitnami/scripts/start-scripts/start-node.sh
826
+ env:
827
+ - name: BITNAMI_DEBUG
828
+ value: "false"
829
+ - name: REDIS_MASTER_PORT_NUMBER
830
+ value: "6379"
831
+ - name: ALLOW_EMPTY_PASSWORD
832
+ value: "no"
833
+ - name: REDIS_PASSWORD
834
+ valueFrom:
835
+ secretKeyRef:
836
+ name: browserstack-secret
837
+ key: redis-password
838
+ - name: REDIS_MASTER_PASSWORD
839
+ valueFrom:
840
+ secretKeyRef:
841
+ name: browserstack-secret
842
+ key: redis-password
843
+ - name: REDIS_TLS_ENABLED
844
+ value: "no"
845
+ - name: REDIS_PORT
846
+ value: "6379"
847
+ - name: REDIS_SENTINEL_TLS_ENABLED
848
+ value: "no"
849
+ - name: REDIS_SENTINEL_PORT
850
+ value: "26379"
851
+ - name: REDIS_DATA_DIR
852
+ value: /data
853
+ ports:
854
+ - name: redis
855
+ containerPort: 6379
856
+ startupProbe:
857
+ failureThreshold: 22
858
+ initialDelaySeconds: 10
859
+ periodSeconds: 10
860
+ successThreshold: 1
861
+ timeoutSeconds: 5
862
+ exec:
863
+ command:
864
+ - sh
865
+ - -c
866
+ - /health/ping_liveness_local.sh 5
867
+ livenessProbe:
868
+ initialDelaySeconds: 20
869
+ periodSeconds: 5
870
+ timeoutSeconds: 5
871
+ successThreshold: 1
872
+ failureThreshold: 5
873
+ exec:
874
+ command:
875
+ - sh
876
+ - -c
877
+ - /health/ping_liveness_local.sh 5
878
+ readinessProbe:
879
+ initialDelaySeconds: 20
880
+ periodSeconds: 5
881
+ timeoutSeconds: 1
882
+ successThreshold: 1
883
+ failureThreshold: 5
884
+ exec:
885
+ command:
886
+ - sh
887
+ - -c
888
+ - /health/ping_readiness_local.sh 1
889
+ resources:
890
+ limits:
891
+ cpu: 512m
892
+ ephemeral-storage: 2Gi
893
+ memory: 256Mi
894
+ requests:
895
+ cpu: 256m
896
+ ephemeral-storage: 50Mi
897
+ memory: 128Mi
898
+ volumeMounts:
899
+ - name: start-scripts
900
+ mountPath: /opt/bitnami/scripts/start-scripts
901
+ - name: health
902
+ mountPath: /health
903
+ - name: sentinel-data
904
+ mountPath: /opt/bitnami/redis-sentinel/etc
905
+ - name: redis-data
906
+ mountPath: /data
907
+ - name: config
908
+ mountPath: /opt/bitnami/redis/mounted-etc
909
+ - name: empty-dir
910
+ mountPath: /opt/bitnami/redis/etc
911
+ subPath: app-conf-dir
912
+ - name: empty-dir
913
+ mountPath: /tmp
914
+ subPath: tmp-dir
915
+ - name: sentinel
916
+ image: public.ecr.aws/v4a1k5d3/browserstack/turboscale-kafka-uploader:sentinel_7.4.1-debian-12-r3
917
+ imagePullPolicy: "IfNotPresent"
918
+ lifecycle:
919
+ preStop:
920
+ exec:
921
+ command:
922
+ - /bin/bash
923
+ - -c
924
+ - /opt/bitnami/scripts/start-scripts/prestop-sentinel.sh
925
+ securityContext:
926
+ allowPrivilegeEscalation: false
927
+ capabilities:
928
+ drop:
929
+ - ALL
930
+ readOnlyRootFilesystem: true
931
+ runAsGroup: 1001
932
+ runAsNonRoot: true
933
+ runAsUser: 1001
934
+ seLinuxOptions: {}
935
+ seccompProfile:
936
+ type: RuntimeDefault
937
+ command:
938
+ - /bin/bash
939
+ args:
940
+ - -c
941
+ - /opt/bitnami/scripts/start-scripts/start-sentinel.sh
942
+ env:
943
+ - name: BITNAMI_DEBUG
944
+ value: "false"
945
+ - name: REDIS_PASSWORD
946
+ valueFrom:
947
+ secretKeyRef:
948
+ name: browserstack-secret
949
+ key: redis-password
950
+ - name: REDIS_SENTINEL_TLS_ENABLED
951
+ value: "no"
952
+ - name: REDIS_SENTINEL_PORT
953
+ value: "26379"
954
+ ports:
955
+ - name: redis-sentinel
956
+ containerPort: 26379
957
+ startupProbe:
958
+ failureThreshold: 22
959
+ initialDelaySeconds: 10
960
+ periodSeconds: 10
961
+ successThreshold: 1
962
+ timeoutSeconds: 5
963
+ exec:
964
+ command:
965
+ - sh
966
+ - -c
967
+ - /health/ping_sentinel.sh 5
968
+ livenessProbe:
969
+ initialDelaySeconds: 20
970
+ periodSeconds: 10
971
+ timeoutSeconds: 5
972
+ successThreshold: 1
973
+ failureThreshold: 6
974
+ exec:
975
+ command:
976
+ - sh
977
+ - -c
978
+ - /health/ping_sentinel.sh 5
979
+ readinessProbe:
980
+ initialDelaySeconds: 20
981
+ periodSeconds: 5
982
+ timeoutSeconds: 1
983
+ successThreshold: 1
984
+ failureThreshold: 6
985
+ exec:
986
+ command:
987
+ - sh
988
+ - -c
989
+ - /health/ping_sentinel.sh 1
990
+ resources:
991
+ limits:
992
+ cpu: 512m
993
+ ephemeral-storage: 2Gi
994
+ memory: 256Mi
995
+ requests:
996
+ cpu: 256m
997
+ ephemeral-storage: 50Mi
998
+ memory: 128Mi
999
+ volumeMounts:
1000
+ - name: empty-dir
1001
+ mountPath: /tmp
1002
+ subPath: tmp-dir
1003
+ - name: start-scripts
1004
+ mountPath: /opt/bitnami/scripts/start-scripts
1005
+ - name: health
1006
+ mountPath: /health
1007
+ - name: sentinel-data
1008
+ mountPath: /opt/bitnami/redis-sentinel/etc
1009
+ - name: redis-data
1010
+ mountPath: /data
1011
+ - name: config
1012
+ mountPath: /opt/bitnami/redis-sentinel/mounted-etc
1013
+ nodeSelector:
1014
+ kubernetes.io/os: linux
1015
+ volumes:
1016
+ - name: start-scripts
1017
+ configMap:
1018
+ name: turboscale-redis-scripts
1019
+ defaultMode: 493
1020
+ - name: health
1021
+ configMap:
1022
+ name: turboscale-redis-health
1023
+ defaultMode: 493
1024
+ - name: config
1025
+ configMap:
1026
+ name: turboscale-redis-configuration
1027
+ - name: sentinel-data
1028
+ emptyDir: {}
1029
+ - name: empty-dir
1030
+ emptyDir: {}
1031
+ volumeClaimTemplates:
1032
+ - apiVersion: v1
1033
+ kind: PersistentVolumeClaim
1034
+ metadata:
1035
+ name: redis-data
1036
+ labels:
1037
+ app.kubernetes.io/instance: turboscale
1038
+ app.kubernetes.io/name: redis
1039
+ app.kubernetes.io/component: node
1040
+ spec:
1041
+ storageClassName: <StorageClassName>
1042
+ accessModes:
1043
+ - ReadWriteOnce
1044
+ resources:
1045
+ limits:
1046
+ storage: 4Gi
1047
+ requests:
1048
+ storage: 1Gi