Skip to content

Commit 7bbf165

Browse files
committed
✨ Adapt MCP protocal to different program language #416
[Specification Details] 1. Modify the naming conventions for containers. 2. Modify test cases
1 parent 65750d1 commit 7bbf165

File tree

2 files changed

+35
-33
lines changed

2 files changed

+35
-33
lines changed

sdk/nexent/container/docker_client.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,13 @@ def find_free_port(self, start_port: int = 5020, max_attempts: int = 100) -> int
172172
f"No available port found in range {start_port}-{start_port + max_attempts}"
173173
)
174174

175-
def _generate_container_name(self, service_name: str, user_id: str) -> str:
176-
"""Generate unique container name"""
175+
def _generate_container_name(self, service_name: str, tenant_id: str, user_id: str) -> str:
176+
"""Generate unique container name with service, tenant, and user segments."""
177177
# Sanitize service name for container name (only alphanumeric and hyphens)
178178
safe_name = "".join(c if c.isalnum() or c == "-" else "-" for c in service_name)
179-
return f"{safe_name}-{user_id[:8]}"
179+
tenant_part = (tenant_id or "")[:8]
180+
user_part = (user_id or "")[:8]
181+
return f"mcp-{safe_name}-{tenant_part}-{user_part}"
180182

181183
async def start_container(
182184
self,
@@ -204,7 +206,7 @@ async def start_container(
204206
Raises:
205207
ContainerError: If container startup fails
206208
"""
207-
container_name = self._generate_container_name(service_name, user_id)
209+
container_name = self._generate_container_name(service_name, tenant_id, user_id)
208210
self._ensure_network(self.DEFAULT_NETWORK_NAME)
209211

210212
# Check if container already exists

test/sdk/container/test_docker_client.py

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def mock_container():
5555
"""Create a mock Docker container"""
5656
container = MagicMock()
5757
container.id = "test-container-id"
58-
container.name = "mcp-test-service-user12345"
58+
container.name = "mcp-test-service-tenant12-user1234"
5959
container.status = "running"
6060
container.attrs = {
6161
"NetworkSettings": {
@@ -316,27 +316,27 @@ class TestGenerateContainerName:
316316

317317
def test_generate_container_name_basic(self, docker_container_client):
318318
"""Test basic container name generation"""
319-
name = docker_container_client._generate_container_name("test-service", "user12345")
320-
assert name == "test-service-user1234"
319+
name = docker_container_client._generate_container_name("test-service", "tenant123", "user12345")
320+
assert name == "mcp-test-service-tenant12-user1234"
321321

322322
def test_generate_container_name_with_special_chars(self, docker_container_client):
323323
"""Test container name generation with special characters"""
324-
name = docker_container_client._generate_container_name("test@service#123", "user12345")
325-
assert name == "test-service-123-user1234"
324+
name = docker_container_client._generate_container_name("test@service#123", "tenant123", "user12345")
325+
assert name == "mcp-test-service-123-tenant12-user1234"
326326
assert "@" not in name
327327
assert "#" not in name
328328

329329
def test_generate_container_name_long_user_id(self, docker_container_client):
330330
"""Test container name generation with long user ID"""
331331
long_user_id = "a" * 20
332-
name = docker_container_client._generate_container_name("test-service", long_user_id)
333-
# Should only use first 8 characters of user_id
334-
assert name == f"test-service-{long_user_id[:8]}"
332+
name = docker_container_client._generate_container_name("test-service", "tenant123", long_user_id)
333+
# Should only use first 8 characters of tenant_id and user_id
334+
assert name == f"mcp-test-service-tenant12-{long_user_id[:8]}"
335335

336336
def test_generate_container_name_short_user_id(self, docker_container_client):
337337
"""Test container name generation with short user ID"""
338-
name = docker_container_client._generate_container_name("test-service", "user")
339-
assert name == "test-service-user"
338+
name = docker_container_client._generate_container_name("test-service", "tenant123", "user")
339+
assert name == "mcp-test-service-tenant12-user"
340340

341341

342342
# ---------------------------------------------------------------------------
@@ -1132,7 +1132,7 @@ def test_list_containers_no_filters(self, docker_container_client, mock_containe
11321132

11331133
assert len(result) == 1
11341134
assert result[0]["container_id"] == "test-container-id"
1135-
assert result[0]["name"] == "mcp-test-service-user12345"
1135+
assert result[0]["name"] == "mcp-test-service-tenant12-user1234"
11361136
assert result[0]["status"] == "running"
11371137
assert result[0]["host_port"] == "5020"
11381138

@@ -1189,7 +1189,7 @@ def test_list_containers_no_port_mapping(self, docker_container_client):
11891189
"""Test listing containers without port mapping"""
11901190
container = MagicMock()
11911191
container.id = "test-container-id"
1192-
container.name = "mcp-test-service-user12345"
1192+
container.name = "mcp-test-service-tenant12-user1234"
11931193
container.status = "running"
11941194
container.attrs = {
11951195
"NetworkSettings": {
@@ -1209,7 +1209,7 @@ def test_list_containers_empty_port_mapping(self, docker_container_client):
12091209
"""Test listing containers with empty port mapping"""
12101210
container = MagicMock()
12111211
container.id = "test-container-id"
1212-
container.name = "mcp-test-service-user12345"
1212+
container.name = "mcp-test-service-tenant12-user1234"
12131213
container.status = "running"
12141214
container.attrs = {
12151215
"NetworkSettings": {
@@ -1230,7 +1230,7 @@ def test_list_containers_host_port_none_or_empty(self, docker_container_client):
12301230
"""Test listing containers when host_port is None or empty string (line 448)"""
12311231
container = MagicMock()
12321232
container.id = "test-container-id"
1233-
container.name = "mcp-test-service-user12345"
1233+
container.name = "mcp-test-service-tenant12-user1234"
12341234
container.status = "running"
12351235
container.attrs = {
12361236
"NetworkSettings": {
@@ -1269,7 +1269,7 @@ def test_list_containers_service_filter_special_chars(self, docker_container_cli
12691269
result = docker_container_client.list_containers(service_name="test@service#123")
12701270

12711271
# Should match because sanitized name is "test-service-123"
1272-
assert len(result) == 0 # Actually won't match because container name is "mcp-test-service-user12345"
1272+
assert len(result) == 0 # Actually will not match because container name is "mcp-test-service-tenant12-user1234"
12731273

12741274

12751275
# ---------------------------------------------------------------------------
@@ -1343,7 +1343,7 @@ def test_get_container_status_success(self, docker_container_client, mock_contai
13431343

13441344
assert result is not None
13451345
assert result["container_id"] == "test-container-id"
1346-
assert result["name"] == "mcp-test-service-user12345"
1346+
assert result["name"] == "mcp-test-service-tenant12-user1234"
13471347
assert result["status"] == "running"
13481348
assert result["host_port"] == "5020"
13491349
assert result["created"] == "2024-01-01T00:00:00Z"
@@ -1361,7 +1361,7 @@ def test_get_container_status_no_port_mapping(self, docker_container_client):
13611361
"""Test getting container status without port mapping"""
13621362
container = MagicMock()
13631363
container.id = "test-container-id"
1364-
container.name = "mcp-test-service-user12345"
1364+
container.name = "mcp-test-service-tenant12-user1234"
13651365
container.status = "running"
13661366
container.attrs = {
13671367
"NetworkSettings": {
@@ -1391,7 +1391,7 @@ def test_get_container_status_empty_port_mapping(self, docker_container_client):
13911391
"""Test getting container status with empty port mapping"""
13921392
container = MagicMock()
13931393
container.id = "test-container-id"
1394-
container.name = "mcp-test-service-user12345"
1394+
container.name = "mcp-test-service-tenant12-user1234"
13951395
container.status = "running"
13961396
container.attrs = {
13971397
"NetworkSettings": {
@@ -1414,7 +1414,7 @@ def test_get_container_status_host_port_none_or_empty(self, docker_container_cli
14141414
"""Test getting container status when host_port is None or empty string (line 513)"""
14151415
container = MagicMock()
14161416
container.id = "test-container-id"
1417-
container.name = "mcp-test-service-user12345"
1417+
container.name = "mcp-test-service-tenant12-user1234"
14181418
container.status = "running"
14191419
container.attrs = {
14201420
"NetworkSettings": {
@@ -1864,7 +1864,7 @@ def test_list_containers_in_docker_uses_port_env(self, docker_container_client):
18641864
"""Test listing containers in Docker mode uses PORT env variable"""
18651865
container = MagicMock()
18661866
container.id = "test-container-id"
1867-
container.name = "mcp-test-service-user12345"
1867+
container.name = "mcp-test-service-tenant12-user1234"
18681868
container.status = "running"
18691869
container.attrs = {
18701870
"Config": {
@@ -1877,18 +1877,18 @@ def test_list_containers_in_docker_uses_port_env(self, docker_container_client):
18771877
docker_container_client.client.containers.list.return_value = [container]
18781878

18791879
with patch.object(DockerContainerClient, "_is_running_in_docker", return_value=True), \
1880-
patch.object(DockerContainerClient, "_get_service_host", return_value="mcp-test-service-user12345"):
1880+
patch.object(DockerContainerClient, "_get_service_host", return_value="mcp-test-service-tenant12-user1234"):
18811881
result = docker_container_client.list_containers()
18821882

18831883
assert len(result) == 1
18841884
assert result[0]["host_port"] == "5020"
1885-
assert result[0]["service_url"] == "http://mcp-test-service-user12345:5020/mcp"
1885+
assert result[0]["service_url"] == "http://mcp-test-service-tenant12-user1234:5020/mcp"
18861886

18871887
def test_list_containers_in_docker_no_port_env(self, docker_container_client):
18881888
"""Test listing containers in Docker mode when no PORT env variable"""
18891889
container = MagicMock()
18901890
container.id = "test-container-id"
1891-
container.name = "mcp-test-service-user12345"
1891+
container.name = "mcp-test-service-tenant12-user1234"
18921892
container.status = "running"
18931893
container.attrs = {
18941894
"Config": {
@@ -1901,7 +1901,7 @@ def test_list_containers_in_docker_no_port_env(self, docker_container_client):
19011901
docker_container_client.client.containers.list.return_value = [container]
19021902

19031903
with patch.object(DockerContainerClient, "_is_running_in_docker", return_value=True), \
1904-
patch.object(DockerContainerClient, "_get_service_host", return_value="mcp-test-service-user12345"):
1904+
patch.object(DockerContainerClient, "_get_service_host", return_value="mcp-test-service-tenant12-user1234"):
19051905
result = docker_container_client.list_containers()
19061906

19071907
assert len(result) == 1
@@ -1921,7 +1921,7 @@ def test_get_container_status_in_docker_uses_port_env(self, docker_container_cli
19211921
"""Test getting container status in Docker mode uses PORT env variable"""
19221922
container = MagicMock()
19231923
container.id = "test-container-id"
1924-
container.name = "mcp-test-service-user12345"
1924+
container.name = "mcp-test-service-tenant12-user1234"
19251925
container.status = "running"
19261926
container.attrs = {
19271927
"Config": {
@@ -1936,18 +1936,18 @@ def test_get_container_status_in_docker_uses_port_env(self, docker_container_cli
19361936
docker_container_client.client.containers.get.return_value = container
19371937

19381938
with patch.object(DockerContainerClient, "_is_running_in_docker", return_value=True), \
1939-
patch.object(DockerContainerClient, "_get_service_host", return_value="mcp-test-service-user12345"):
1939+
patch.object(DockerContainerClient, "_get_service_host", return_value="mcp-test-service-tenant12-user1234"):
19401940
result = docker_container_client.get_container_status("test-container-id")
19411941

19421942
assert result is not None
19431943
assert result["host_port"] == "5020"
1944-
assert result["service_url"] == "http://mcp-test-service-user12345:5020/mcp"
1944+
assert result["service_url"] == "http://mcp-test-service-tenant12-user1234:5020/mcp"
19451945

19461946
def test_get_container_status_in_docker_no_port_env(self, docker_container_client):
19471947
"""Test getting container status in Docker mode when no PORT env variable"""
19481948
container = MagicMock()
19491949
container.id = "test-container-id"
1950-
container.name = "mcp-test-service-user12345"
1950+
container.name = "mcp-test-service-tenant12-user1234"
19511951
container.status = "running"
19521952
container.attrs = {
19531953
"Config": {
@@ -1962,7 +1962,7 @@ def test_get_container_status_in_docker_no_port_env(self, docker_container_clien
19621962
docker_container_client.client.containers.get.return_value = container
19631963

19641964
with patch.object(DockerContainerClient, "_is_running_in_docker", return_value=True), \
1965-
patch.object(DockerContainerClient, "_get_service_host", return_value="mcp-test-service-user12345"):
1965+
patch.object(DockerContainerClient, "_get_service_host", return_value="mcp-test-service-tenant12-user1234"):
19661966
result = docker_container_client.get_container_status("test-container-id")
19671967

19681968
assert result is not None

0 commit comments

Comments
 (0)