Skip to content

Commit b704d1c

Browse files
feat: Each replica database URL can now be configured with an individual environment variable, using REPLICA_DATABASE_URL_0, REPLICA_DATABASE_URL_1, etc (#5222)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 31ffb7a commit b704d1c

File tree

3 files changed

+53
-10
lines changed

3 files changed

+53
-10
lines changed

api/app/settings/common.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from task_processor.task_run_method import TaskRunMethod # type: ignore[import-untyped]
2929

3030
from app.routers import ReplicaReadStrategy
31+
from app.utils import get_numbered_env_vars_with_prefix
3132

3233
env = Env()
3334

@@ -177,11 +178,15 @@
177178
),
178179
}
179180
REPLICA_DATABASE_URLS_DELIMITER = env("REPLICA_DATABASE_URLS_DELIMITER", ",")
180-
REPLICA_DATABASE_URLS = env.list(
181-
"REPLICA_DATABASE_URLS",
182-
subcast=str,
183-
default=[],
184-
delimiter=REPLICA_DATABASE_URLS_DELIMITER,
181+
REPLICA_DATABASE_URLS = (
182+
env.list(
183+
"REPLICA_DATABASE_URLS",
184+
subcast=str,
185+
default=[],
186+
delimiter=REPLICA_DATABASE_URLS_DELIMITER,
187+
)
188+
if not os.getenv("REPLICA_DATABASE_URL_0")
189+
else get_numbered_env_vars_with_prefix("REPLICA_DATABASE_URL_")
185190
)
186191
NUM_DB_REPLICAS = len(REPLICA_DATABASE_URLS)
187192

@@ -190,11 +195,15 @@
190195
CROSS_REGION_REPLICA_DATABASE_URLS_DELIMITER = env(
191196
"CROSS_REGION_REPLICA_DATABASE_URLS_DELIMITER", ","
192197
)
193-
CROSS_REGION_REPLICA_DATABASE_URLS: list[str] = env.list(
194-
"CROSS_REGION_REPLICA_DATABASE_URLS",
195-
subcast=str,
196-
default=[],
197-
delimiter=CROSS_REGION_REPLICA_DATABASE_URLS_DELIMITER,
198+
CROSS_REGION_REPLICA_DATABASE_URLS = (
199+
env.list(
200+
"CROSS_REGION_REPLICA_DATABASE_URLS",
201+
subcast=str,
202+
default=[],
203+
delimiter=CROSS_REGION_REPLICA_DATABASE_URLS_DELIMITER,
204+
)
205+
if not os.getenv("CROSS_REGION_REPLICA_DATABASE_URL_0")
206+
else get_numbered_env_vars_with_prefix("CROSS_REGION_REPLICA_DATABASE_URL_")
198207
)
199208
NUM_CROSS_REGION_DB_REPLICAS = len(CROSS_REGION_REPLICA_DATABASE_URLS)
200209

api/app/utils.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
1+
import os
2+
13
import shortuuid
24

35

46
def create_hash() -> str:
57
"""Helper function to create a short hash"""
68
return shortuuid.uuid()
9+
10+
11+
def get_numbered_env_vars_with_prefix(prefix: str) -> list[str]:
12+
"""
13+
Returns a list containing the values of all environment variables whose names have a given prefix followed by an
14+
integer, starting from 0, until no more variables with that prefix are found.
15+
"""
16+
db_urls = []
17+
i = 0
18+
while True:
19+
db_url = os.getenv(f"{prefix}{i}")
20+
if not db_url:
21+
break
22+
db_urls.append(db_url)
23+
i += 1
24+
return db_urls
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import pytest
2+
3+
from app.utils import get_numbered_env_vars_with_prefix
4+
5+
6+
def test_get_numbered_env_vars_with_prefix(monkeypatch: pytest.MonkeyPatch) -> None:
7+
# Given
8+
monkeypatch.setenv("DB_URL_0", "0")
9+
monkeypatch.setenv("DB_URL_1", "1")
10+
monkeypatch.setenv("DB_URL_3", "3")
11+
12+
# When
13+
env_vars = get_numbered_env_vars_with_prefix("DB_URL_")
14+
15+
# Then
16+
assert env_vars == ["0", "1"]

0 commit comments

Comments
 (0)