From 9137c90092b250ff11da0225dadf2290fbef272b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 3 Mar 2026 00:54:00 +0000 Subject: [PATCH 1/3] chore: fix smoketest tunnel removal for Python client - Renamed test_create_and_remove_tunnel to test_create_tunnel_deprecated - Removed tunnel removal attempt that was causing 400 error - Added verification that v2 tunnel persists in devbox info - Updated docstrings to clarify v2 tunnels cannot be removed - Applied fix to both sync and async test files Co-authored-by: albert --- tests/smoketests/sdk/test_async_devbox.py | 18 ++++++++++++------ tests/smoketests/sdk/test_devbox.py | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/tests/smoketests/sdk/test_async_devbox.py b/tests/smoketests/sdk/test_async_devbox.py index 860502cd7..8820432c3 100644 --- a/tests/smoketests/sdk/test_async_devbox.py +++ b/tests/smoketests/sdk/test_async_devbox.py @@ -438,15 +438,20 @@ async def test_create_ssh_key(self, async_sdk_client: AsyncRunloopSDK) -> None: await devbox.shutdown() @pytest.mark.timeout(TWO_MINUTE_TIMEOUT) - async def test_create_and_remove_tunnel(self, async_sdk_client: AsyncRunloopSDK) -> None: - """Test creating and removing a tunnel.""" + async def test_create_tunnel_deprecated(self, async_sdk_client: AsyncRunloopSDK) -> None: + """Test creating a tunnel (deprecated - now creates v2 tunnel). + + Note: The deprecated create_tunnel endpoint now creates v2 Portal tunnels + which cannot be removed. They remain active until the devbox is stopped. + Use enable_tunnel for creating v2 tunnels instead. + """ devbox = await async_sdk_client.devbox.create( name=unique_name("sdk-async-devbox-tunnel"), launch_parameters={"resource_size_request": "SMALL", "keep_alive_time_seconds": 60 * 5}, ) try: - # Create tunnel + # Create tunnel (now creates v2 Portal tunnel) with pytest.warns(DeprecationWarning, match="create_tunnel is deprecated"): tunnel = await devbox.net.create_tunnel(port=8080) assert tunnel is not None @@ -454,9 +459,10 @@ async def test_create_and_remove_tunnel(self, async_sdk_client: AsyncRunloopSDK) assert tunnel.port == 8080 assert tunnel.devbox_id == devbox.id - # Remove tunnel - with pytest.warns(DeprecationWarning, match="remove_tunnel is deprecated"): - await devbox.net.remove_tunnel(port=8080) + # Verify tunnel persists in devbox info (v2 tunnels cannot be removed) + info = await devbox.info() + assert info.tunnel is not None + assert info.tunnel.tunnel_key is not None finally: await devbox.shutdown() diff --git a/tests/smoketests/sdk/test_devbox.py b/tests/smoketests/sdk/test_devbox.py index 196fb312e..83cd17700 100644 --- a/tests/smoketests/sdk/test_devbox.py +++ b/tests/smoketests/sdk/test_devbox.py @@ -435,15 +435,20 @@ def test_create_ssh_key(self, sdk_client: RunloopSDK) -> None: devbox.shutdown() @pytest.mark.timeout(TWO_MINUTE_TIMEOUT) - def test_create_and_remove_tunnel(self, sdk_client: RunloopSDK) -> None: - """Test creating and removing a tunnel.""" + def test_create_tunnel_deprecated(self, sdk_client: RunloopSDK) -> None: + """Test creating a tunnel (deprecated - now creates v2 tunnel). + + Note: The deprecated create_tunnel endpoint now creates v2 Portal tunnels + which cannot be removed. They remain active until the devbox is stopped. + Use enable_tunnel for creating v2 tunnels instead. + """ devbox = sdk_client.devbox.create( name=unique_name("sdk-devbox-tunnel"), launch_parameters={"resource_size_request": "SMALL", "keep_alive_time_seconds": 60 * 5}, ) try: - # Create tunnel + # Create tunnel (now creates v2 Portal tunnel) with pytest.warns(DeprecationWarning, match="create_tunnel is deprecated"): tunnel = devbox.net.create_tunnel(port=8080) assert tunnel is not None @@ -451,9 +456,10 @@ def test_create_and_remove_tunnel(self, sdk_client: RunloopSDK) -> None: assert tunnel.port == 8080 assert tunnel.devbox_id == devbox.id - # Remove tunnel - with pytest.warns(DeprecationWarning, match="remove_tunnel is deprecated"): - devbox.net.remove_tunnel(port=8080) + # Verify tunnel persists in devbox info (v2 tunnels cannot be removed) + info = devbox.info() + assert info.tunnel is not None + assert info.tunnel.tunnel_key is not None finally: devbox.shutdown() From 2fb1105057b40ae5d0885949ae29b9398d68dee3 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 4 Mar 2026 00:28:04 +0000 Subject: [PATCH 2/3] fix: use get_info() instead of info() method - Fixed type checking errors in tunnel tests - Changed devbox.info() to devbox.get_info() in both sync and async tests Co-authored-by: albert --- tests/smoketests/sdk/test_async_devbox.py | 2 +- tests/smoketests/sdk/test_devbox.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/smoketests/sdk/test_async_devbox.py b/tests/smoketests/sdk/test_async_devbox.py index 8820432c3..ae631dca7 100644 --- a/tests/smoketests/sdk/test_async_devbox.py +++ b/tests/smoketests/sdk/test_async_devbox.py @@ -460,7 +460,7 @@ async def test_create_tunnel_deprecated(self, async_sdk_client: AsyncRunloopSDK) assert tunnel.devbox_id == devbox.id # Verify tunnel persists in devbox info (v2 tunnels cannot be removed) - info = await devbox.info() + info = await devbox.get_info() assert info.tunnel is not None assert info.tunnel.tunnel_key is not None finally: diff --git a/tests/smoketests/sdk/test_devbox.py b/tests/smoketests/sdk/test_devbox.py index 83cd17700..ffec5e0cd 100644 --- a/tests/smoketests/sdk/test_devbox.py +++ b/tests/smoketests/sdk/test_devbox.py @@ -457,7 +457,7 @@ def test_create_tunnel_deprecated(self, sdk_client: RunloopSDK) -> None: assert tunnel.devbox_id == devbox.id # Verify tunnel persists in devbox info (v2 tunnels cannot be removed) - info = devbox.info() + info = devbox.get_info() assert info.tunnel is not None assert info.tunnel.tunnel_key is not None finally: From 234dcdf7596058e8e132676d42953439b78d589a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 4 Mar 2026 00:29:55 +0000 Subject: [PATCH 3/3] chore: format files with ruff Co-authored-by: albert --- tests/smoketests/sdk/test_async_devbox.py | 2 +- tests/smoketests/sdk/test_devbox.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/smoketests/sdk/test_async_devbox.py b/tests/smoketests/sdk/test_async_devbox.py index ae631dca7..cbfc5c030 100644 --- a/tests/smoketests/sdk/test_async_devbox.py +++ b/tests/smoketests/sdk/test_async_devbox.py @@ -440,7 +440,7 @@ async def test_create_ssh_key(self, async_sdk_client: AsyncRunloopSDK) -> None: @pytest.mark.timeout(TWO_MINUTE_TIMEOUT) async def test_create_tunnel_deprecated(self, async_sdk_client: AsyncRunloopSDK) -> None: """Test creating a tunnel (deprecated - now creates v2 tunnel). - + Note: The deprecated create_tunnel endpoint now creates v2 Portal tunnels which cannot be removed. They remain active until the devbox is stopped. Use enable_tunnel for creating v2 tunnels instead. diff --git a/tests/smoketests/sdk/test_devbox.py b/tests/smoketests/sdk/test_devbox.py index ffec5e0cd..38e885f71 100644 --- a/tests/smoketests/sdk/test_devbox.py +++ b/tests/smoketests/sdk/test_devbox.py @@ -437,7 +437,7 @@ def test_create_ssh_key(self, sdk_client: RunloopSDK) -> None: @pytest.mark.timeout(TWO_MINUTE_TIMEOUT) def test_create_tunnel_deprecated(self, sdk_client: RunloopSDK) -> None: """Test creating a tunnel (deprecated - now creates v2 tunnel). - + Note: The deprecated create_tunnel endpoint now creates v2 Portal tunnels which cannot be removed. They remain active until the devbox is stopped. Use enable_tunnel for creating v2 tunnels instead.