Skip to content

Commit 44685c4

Browse files
committed
Add data regions support
1 parent 4af94ea commit 44685c4

4 files changed

Lines changed: 121 additions & 3 deletions

File tree

aikido_zen/helpers/token.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,22 @@ def get_token_from_env():
2727
if aikido_token_env is not None:
2828
return Token(aikido_token_env)
2929
return None
30+
31+
32+
def extract_region_from_token(token):
33+
"""
34+
Extracts the region from a runtime token.
35+
36+
New format: AIK_RUNTIME_{sys_group_id}_{service_id}_{region}_{random}
37+
Old format: AIK_RUNTIME_{sys_group_id}_{service_id}_{random}
38+
"""
39+
if not token or not token.startswith("AIK_RUNTIME_"):
40+
return "EU"
41+
42+
token_without_prefix = token[len("AIK_RUNTIME_") :]
43+
parts = token_without_prefix.split("_")
44+
45+
if len(parts) == 4:
46+
return parts[2]
47+
48+
return "EU"

aikido_zen/helpers/token_test.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import pytest
2-
from aikido_zen.helpers.token import Token
2+
from aikido_zen.helpers.token import Token, extract_region_from_token
33

44

55
# Test Token Class :
@@ -23,3 +23,32 @@ def test_token_instance():
2323
token_str = "my_token"
2424
token = Token(token_str)
2525
assert isinstance(token, Token)
26+
27+
28+
# Test extract_region_from_token :
29+
def test_extract_region_from_token_empty():
30+
assert extract_region_from_token("") == "EU"
31+
32+
33+
def test_extract_region_from_token_none():
34+
assert extract_region_from_token(None) == "EU"
35+
36+
37+
def test_extract_region_from_token_no_prefix():
38+
assert extract_region_from_token("my_token") == "EU"
39+
40+
41+
def test_extract_region_from_token_old_format():
42+
assert extract_region_from_token("AIK_RUNTIME_123_456_random") == "EU"
43+
44+
45+
def test_extract_region_from_token_new_format():
46+
assert extract_region_from_token("AIK_RUNTIME_123_456_US_random") == "US"
47+
48+
49+
def test_extract_region_from_token_new_format_me():
50+
assert extract_region_from_token("AIK_RUNTIME_123_456_ME_random") == "ME"
51+
52+
53+
def test_extract_region_from_token_new_format_au():
54+
assert extract_region_from_token("AIK_RUNTIME_123_456_AU_random") == "AU"

aikido_zen/helpers/urls/get_api_url.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@
33
import os
44
from urllib.parse import urlunparse
55
from aikido_zen.helpers.try_parse_url import try_parse_url
6+
from aikido_zen.helpers.token import extract_region_from_token, get_token_from_env
67

78
DEFAULT_API_URL = "https://guard.aikido.dev/"
9+
REGION_API_URLS = {
10+
"US": "https://guard.us.aikido.dev/",
11+
"ME": "https://guard.me.aikido.dev/",
12+
"AU": "https://guard.au.aikido.dev/",
13+
}
814

915

1016
def get_api_url():
11-
"""Checks environment var AIKIDO_ENDPOINT for the api URL"""
17+
"""Checks environment var AIKIDO_ENDPOINT for the api URL, falling back
18+
to a region-specific URL based on the AIKIDO_TOKEN"""
1219
realtime_url = os.getenv("AIKIDO_ENDPOINT")
1320
if realtime_url is not None:
1421
parsed_url = try_parse_url(realtime_url)
@@ -18,4 +25,7 @@ def get_api_url():
1825
# Make sure ends with a slash :
1926
return urlunparse(parsed_url) + "/"
2027
return urlunparse(parsed_url)
21-
return DEFAULT_API_URL
28+
29+
token = get_token_from_env()
30+
region = extract_region_from_token(str(token) if token else "")
31+
return REGION_API_URLS.get(region, DEFAULT_API_URL)

aikido_zen/helpers/urls/get_api_url_test.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,64 @@ def test_get_api_url_valid_url_no_trailing_slash():
3333
assert get_api_url() == valid_url_no_slash + "/"
3434

3535

36+
def test_get_api_url_no_token_defaults_to_eu():
37+
"""Test when neither AIKIDO_ENDPOINT nor AIKIDO_TOKEN is set."""
38+
with patch.dict(os.environ, {}, clear=True):
39+
assert get_api_url() == DEFAULT_API_URL
40+
41+
42+
def test_get_api_url_old_format_token_defaults_to_eu():
43+
"""Test when AIKIDO_TOKEN is set with the old token format."""
44+
with patch.dict(
45+
os.environ,
46+
{"AIKIDO_TOKEN": "AIK_RUNTIME_123_456_random"},
47+
clear=True,
48+
):
49+
assert get_api_url() == DEFAULT_API_URL
50+
51+
52+
def test_get_api_url_us_region_token():
53+
"""Test when AIKIDO_TOKEN encodes the US region."""
54+
with patch.dict(
55+
os.environ,
56+
{"AIKIDO_TOKEN": "AIK_RUNTIME_123_456_US_random"},
57+
clear=True,
58+
):
59+
assert get_api_url() == "https://guard.us.aikido.dev/"
60+
61+
62+
def test_get_api_url_me_region_token():
63+
"""Test when AIKIDO_TOKEN encodes the ME region."""
64+
with patch.dict(
65+
os.environ,
66+
{"AIKIDO_TOKEN": "AIK_RUNTIME_123_456_ME_random"},
67+
clear=True,
68+
):
69+
assert get_api_url() == "https://guard.me.aikido.dev/"
70+
71+
72+
def test_get_api_url_au_region_token():
73+
"""Test when AIKIDO_TOKEN encodes the AU region."""
74+
with patch.dict(
75+
os.environ,
76+
{"AIKIDO_TOKEN": "AIK_RUNTIME_123_456_AU_random"},
77+
clear=True,
78+
):
79+
assert get_api_url() == "https://guard.au.aikido.dev/"
80+
81+
82+
def test_get_api_url_endpoint_env_var_takes_precedence_over_token():
83+
"""Test that AIKIDO_ENDPOINT overrides region derived from AIKIDO_TOKEN."""
84+
valid_url = "https://example.com/api"
85+
with patch.dict(
86+
os.environ,
87+
{
88+
"AIKIDO_ENDPOINT": valid_url,
89+
"AIKIDO_TOKEN": "AIK_RUNTIME_123_456_US_random",
90+
},
91+
clear=True,
92+
):
93+
assert get_api_url() == valid_url + "/"
94+
95+
3696
# You may need to mock the try_parse_url function if it has side effects or is complex

0 commit comments

Comments
 (0)