Skip to content

Commit 6cff97e

Browse files
fix(tunnels): allow tunnel removal (#8257)
1 parent 95b2ffc commit 6cff97e

11 files changed

Lines changed: 52 additions & 114 deletions

File tree

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 117
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-3d441e9c2074aef7bd1e87b2ebfbe5c25e340084dbdfeed8a2e4dc9384561e3b.yml
3-
openapi_spec_hash: 250bfdf2c2270ade53c058419e23c5dc
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-64b2ded3d3cc58131c7ebf36c411f43c3d8dabae0b5b1edd65dd7dab307c54a1.yml
3+
openapi_spec_hash: 80fabb5e89a61299203113505a894dc2
44
config_hash: de99cfce88e2d1f02246dc6c2f43bc6c

api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ Methods:
155155
- <code title="post /v1/devboxes/{id}/keep_alive">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">keep_alive</a>(id) -> object</code>
156156
- <code title="get /v1/devboxes/disk_snapshots">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">list_disk_snapshots</a>(\*\*<a href="src/runloop_api_client/types/devbox_list_disk_snapshots_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_snapshot_view.py">SyncDiskSnapshotsCursorIDPage[DevboxSnapshotView]</a></code>
157157
- <code title="post /v1/devboxes/{id}/read_file_contents">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">read_file_contents</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_read_file_contents_params.py">params</a>) -> str</code>
158-
- <code title="post /v1/devboxes/{id}/remove_tunnel">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">remove_tunnel</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_remove_tunnel_params.py">params</a>) -> object</code>
158+
- <code title="post /v1/devboxes/{id}/remove_tunnel">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">remove_tunnel</a>(id) -> object</code>
159159
- <code title="post /v1/devboxes/{id}/resume">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">resume</a>(id) -> <a href="./src/runloop_api_client/types/devbox_view.py">DevboxView</a></code>
160160
- <code title="get /v1/devboxes/{id}/usage">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">retrieve_resource_usage</a>(id) -> <a href="./src/runloop_api_client/types/devbox_resource_usage_view.py">DevboxResourceUsageView</a></code>
161161
- <code title="post /v1/devboxes/{id}/shutdown">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">shutdown</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_shutdown_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_view.py">DevboxView</a></code>

src/runloop_api_client/resources/devboxes/devboxes.py

Lines changed: 12 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
devbox_download_file_params,
3131
devbox_enable_tunnel_params,
3232
devbox_execute_async_params,
33-
devbox_remove_tunnel_params,
3433
devbox_snapshot_disk_params,
3534
devbox_wait_for_command_params,
3635
devbox_read_file_contents_params,
@@ -1257,14 +1256,10 @@ def read_file_contents(
12571256
cast_to=str,
12581257
)
12591258

1260-
@typing_extensions.deprecated(
1261-
"remove_tunnel is deprecated; V2 tunnels cannot be removed and close on devbox shutdown."
1262-
)
12631259
def remove_tunnel(
12641260
self,
12651261
id: str,
12661262
*,
1267-
port: int,
12681263
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
12691264
# The extra values given here take precedence over values defined on the client or passed to this method.
12701265
extra_headers: Headers | None = None,
@@ -1273,14 +1268,10 @@ def remove_tunnel(
12731268
timeout: float | httpx.Timeout | None | NotGiven = not_given,
12741269
idempotency_key: str | None = None,
12751270
) -> object:
1276-
"""[Deprecated] V2 tunnels cannot be removed and close on devbox shutdown.
1277-
1278-
This endpoint
1279-
removes a legacy tunnel.
1271+
"""
1272+
Remove an existing V2 tunnel from the Devbox.
12801273
12811274
Args:
1282-
port: Devbox port that tunnel will expose.
1283-
12841275
extra_headers: Send extra headers
12851276
12861277
extra_query: Add additional query parameters to the request
@@ -1295,7 +1286,6 @@ def remove_tunnel(
12951286
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
12961287
return self._post(
12971288
path_template("/v1/devboxes/{id}/remove_tunnel", id=id),
1298-
body=maybe_transform({"port": port}, devbox_remove_tunnel_params.DevboxRemoveTunnelParams),
12991289
options=make_request_options(
13001290
extra_headers=extra_headers,
13011291
extra_query=extra_query,
@@ -2901,14 +2891,10 @@ async def read_file_contents(
29012891
cast_to=str,
29022892
)
29032893

2904-
@typing_extensions.deprecated(
2905-
"remove_tunnel is deprecated; V2 tunnels cannot be removed and close on devbox shutdown."
2906-
)
29072894
async def remove_tunnel(
29082895
self,
29092896
id: str,
29102897
*,
2911-
port: int,
29122898
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
29132899
# The extra values given here take precedence over values defined on the client or passed to this method.
29142900
extra_headers: Headers | None = None,
@@ -2917,14 +2903,10 @@ async def remove_tunnel(
29172903
timeout: float | httpx.Timeout | None | NotGiven = not_given,
29182904
idempotency_key: str | None = None,
29192905
) -> object:
2920-
"""[Deprecated] V2 tunnels cannot be removed and close on devbox shutdown.
2921-
2922-
This endpoint
2923-
removes a legacy tunnel.
2906+
"""
2907+
Remove an existing V2 tunnel from the Devbox.
29242908
29252909
Args:
2926-
port: Devbox port that tunnel will expose.
2927-
29282910
extra_headers: Send extra headers
29292911
29302912
extra_query: Add additional query parameters to the request
@@ -2939,7 +2921,6 @@ async def remove_tunnel(
29392921
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
29402922
return await self._post(
29412923
path_template("/v1/devboxes/{id}/remove_tunnel", id=id),
2942-
body=await async_maybe_transform({"port": port}, devbox_remove_tunnel_params.DevboxRemoveTunnelParams),
29432924
options=make_request_options(
29442925
extra_headers=extra_headers,
29452926
extra_query=extra_query,
@@ -3481,10 +3462,8 @@ def __init__(self, devboxes: DevboxesResource) -> None:
34813462
self.read_file_contents = to_raw_response_wrapper(
34823463
devboxes.read_file_contents,
34833464
)
3484-
self.remove_tunnel = ( # pyright: ignore[reportDeprecated]
3485-
to_raw_response_wrapper(
3486-
devboxes.remove_tunnel, # pyright: ignore[reportDeprecated],
3487-
)
3465+
self.remove_tunnel = to_raw_response_wrapper(
3466+
devboxes.remove_tunnel,
34883467
)
34893468
self.resume = to_raw_response_wrapper(
34903469
devboxes.resume,
@@ -3584,10 +3563,8 @@ def __init__(self, devboxes: AsyncDevboxesResource) -> None:
35843563
self.read_file_contents = async_to_raw_response_wrapper(
35853564
devboxes.read_file_contents,
35863565
)
3587-
self.remove_tunnel = ( # pyright: ignore[reportDeprecated]
3588-
async_to_raw_response_wrapper(
3589-
devboxes.remove_tunnel, # pyright: ignore[reportDeprecated],
3590-
)
3566+
self.remove_tunnel = async_to_raw_response_wrapper(
3567+
devboxes.remove_tunnel,
35913568
)
35923569
self.resume = async_to_raw_response_wrapper(
35933570
devboxes.resume,
@@ -3687,10 +3664,8 @@ def __init__(self, devboxes: DevboxesResource) -> None:
36873664
self.read_file_contents = to_streamed_response_wrapper(
36883665
devboxes.read_file_contents,
36893666
)
3690-
self.remove_tunnel = ( # pyright: ignore[reportDeprecated]
3691-
to_streamed_response_wrapper(
3692-
devboxes.remove_tunnel, # pyright: ignore[reportDeprecated],
3693-
)
3667+
self.remove_tunnel = to_streamed_response_wrapper(
3668+
devboxes.remove_tunnel,
36943669
)
36953670
self.resume = to_streamed_response_wrapper(
36963671
devboxes.resume,
@@ -3790,10 +3765,8 @@ def __init__(self, devboxes: AsyncDevboxesResource) -> None:
37903765
self.read_file_contents = async_to_streamed_response_wrapper(
37913766
devboxes.read_file_contents,
37923767
)
3793-
self.remove_tunnel = ( # pyright: ignore[reportDeprecated]
3794-
async_to_streamed_response_wrapper(
3795-
devboxes.remove_tunnel, # pyright: ignore[reportDeprecated],
3796-
)
3768+
self.remove_tunnel = async_to_streamed_response_wrapper(
3769+
devboxes.remove_tunnel,
37973770
)
37983771
self.resume = async_to_streamed_response_wrapper(
37993772
devboxes.resume,

src/runloop_api_client/sdk/_types.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
NetworkPolicyListParams,
2727
DevboxDownloadFileParams,
2828
DevboxEnableTunnelParams,
29-
DevboxRemoveTunnelParams,
3029
DevboxSnapshotDiskParams,
3130
GatewayConfigCreateParams,
3231
GatewayConfigUpdateParams,
@@ -127,7 +126,7 @@ class SDKDevboxEnableTunnelParams(DevboxEnableTunnelParams, LongRequestOptions):
127126
pass
128127

129128

130-
class SDKDevboxRemoveTunnelParams(DevboxRemoveTunnelParams, LongRequestOptions):
129+
class SDKDevboxRemoveTunnelParams(LongRequestOptions):
131130
pass
132131

133132

src/runloop_api_client/sdk/async_devbox.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ async def remove_tunnel(
840840
:rtype: object
841841
842842
Example:
843-
>>> await devbox.net.remove_tunnel(port=8080)
843+
>>> await devbox.net.remove_tunnel()
844844
"""
845845
warnings.warn(
846846
"remove_tunnel is deprecated; V2 tunnels cannot be removed and close on devbox shutdown.",

src/runloop_api_client/sdk/devbox.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,7 @@ def remove_tunnel(
843843
:rtype: object
844844
845845
Example:
846-
>>> devbox.net.remove_tunnel(port=8080)
846+
>>> devbox.net.remove_tunnel()
847847
"""
848848
warnings.warn(
849849
"remove_tunnel is deprecated; V2 tunnels cannot be removed and close on devbox shutdown.",

src/runloop_api_client/types/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@
9999
from .devbox_download_file_params import DevboxDownloadFileParams as DevboxDownloadFileParams
100100
from .devbox_enable_tunnel_params import DevboxEnableTunnelParams as DevboxEnableTunnelParams
101101
from .devbox_execute_async_params import DevboxExecuteAsyncParams as DevboxExecuteAsyncParams
102-
from .devbox_remove_tunnel_params import DevboxRemoveTunnelParams as DevboxRemoveTunnelParams
103102
from .devbox_snapshot_disk_params import DevboxSnapshotDiskParams as DevboxSnapshotDiskParams
104103
from .scenario_list_public_params import ScenarioListPublicParams as ScenarioListPublicParams
105104
from .benchmark_definitions_params import BenchmarkDefinitionsParams as BenchmarkDefinitionsParams

src/runloop_api_client/types/devbox_remove_tunnel_params.py

Lines changed: 0 additions & 12 deletions
This file was deleted.

tests/api_resources/test_devboxes.py

Lines changed: 34 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -727,21 +727,16 @@ def test_path_params_read_file_contents(self, client: Runloop) -> None:
727727

728728
@parametrize
729729
def test_method_remove_tunnel(self, client: Runloop) -> None:
730-
with pytest.warns(DeprecationWarning):
731-
devbox = client.devboxes.remove_tunnel(
732-
id="id",
733-
port=0,
734-
)
735-
730+
devbox = client.devboxes.remove_tunnel(
731+
"id",
732+
)
736733
assert_matches_type(object, devbox, path=["response"])
737734

738735
@parametrize
739736
def test_raw_response_remove_tunnel(self, client: Runloop) -> None:
740-
with pytest.warns(DeprecationWarning):
741-
response = client.devboxes.with_raw_response.remove_tunnel(
742-
id="id",
743-
port=0,
744-
)
737+
response = client.devboxes.with_raw_response.remove_tunnel(
738+
"id",
739+
)
745740

746741
assert response.is_closed is True
747742
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -750,27 +745,23 @@ def test_raw_response_remove_tunnel(self, client: Runloop) -> None:
750745

751746
@parametrize
752747
def test_streaming_response_remove_tunnel(self, client: Runloop) -> None:
753-
with pytest.warns(DeprecationWarning):
754-
with client.devboxes.with_streaming_response.remove_tunnel(
755-
id="id",
756-
port=0,
757-
) as response:
758-
assert not response.is_closed
759-
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
748+
with client.devboxes.with_streaming_response.remove_tunnel(
749+
"id",
750+
) as response:
751+
assert not response.is_closed
752+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
760753

761-
devbox = response.parse()
762-
assert_matches_type(object, devbox, path=["response"])
754+
devbox = response.parse()
755+
assert_matches_type(object, devbox, path=["response"])
763756

764757
assert cast(Any, response.is_closed) is True
765758

766759
@parametrize
767760
def test_path_params_remove_tunnel(self, client: Runloop) -> None:
768-
with pytest.warns(DeprecationWarning):
769-
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
770-
client.devboxes.with_raw_response.remove_tunnel(
771-
id="",
772-
port=0,
773-
)
761+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
762+
client.devboxes.with_raw_response.remove_tunnel(
763+
"",
764+
)
774765

775766
@parametrize
776767
def test_method_resume(self, client: Runloop) -> None:
@@ -2350,21 +2341,16 @@ async def test_path_params_read_file_contents(self, async_client: AsyncRunloop)
23502341

23512342
@parametrize
23522343
async def test_method_remove_tunnel(self, async_client: AsyncRunloop) -> None:
2353-
with pytest.warns(DeprecationWarning):
2354-
devbox = await async_client.devboxes.remove_tunnel(
2355-
id="id",
2356-
port=0,
2357-
)
2358-
2344+
devbox = await async_client.devboxes.remove_tunnel(
2345+
"id",
2346+
)
23592347
assert_matches_type(object, devbox, path=["response"])
23602348

23612349
@parametrize
23622350
async def test_raw_response_remove_tunnel(self, async_client: AsyncRunloop) -> None:
2363-
with pytest.warns(DeprecationWarning):
2364-
response = await async_client.devboxes.with_raw_response.remove_tunnel(
2365-
id="id",
2366-
port=0,
2367-
)
2351+
response = await async_client.devboxes.with_raw_response.remove_tunnel(
2352+
"id",
2353+
)
23682354

23692355
assert response.is_closed is True
23702356
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -2373,27 +2359,23 @@ async def test_raw_response_remove_tunnel(self, async_client: AsyncRunloop) -> N
23732359

23742360
@parametrize
23752361
async def test_streaming_response_remove_tunnel(self, async_client: AsyncRunloop) -> None:
2376-
with pytest.warns(DeprecationWarning):
2377-
async with async_client.devboxes.with_streaming_response.remove_tunnel(
2378-
id="id",
2379-
port=0,
2380-
) as response:
2381-
assert not response.is_closed
2382-
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
2362+
async with async_client.devboxes.with_streaming_response.remove_tunnel(
2363+
"id",
2364+
) as response:
2365+
assert not response.is_closed
2366+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
23832367

2384-
devbox = await response.parse()
2385-
assert_matches_type(object, devbox, path=["response"])
2368+
devbox = await response.parse()
2369+
assert_matches_type(object, devbox, path=["response"])
23862370

23872371
assert cast(Any, response.is_closed) is True
23882372

23892373
@parametrize
23902374
async def test_path_params_remove_tunnel(self, async_client: AsyncRunloop) -> None:
2391-
with pytest.warns(DeprecationWarning):
2392-
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
2393-
await async_client.devboxes.with_raw_response.remove_tunnel(
2394-
id="",
2395-
port=0,
2396-
)
2375+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
2376+
await async_client.devboxes.with_raw_response.remove_tunnel(
2377+
"",
2378+
)
23972379

23982380
@parametrize
23992381
async def test_method_resume(self, async_client: AsyncRunloop) -> None:

tests/sdk/async_devbox/test_interfaces.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,6 @@ async def test_remove_tunnel(self, mock_async_client: AsyncMock) -> None:
186186
devbox = AsyncDevbox(mock_async_client, "dbx_123")
187187
with pytest.warns(DeprecationWarning, match="remove_tunnel is deprecated"):
188188
result = await devbox.net.remove_tunnel(
189-
port=8080,
190189
extra_headers={"X-Custom": "value"},
191190
extra_query={"param": "value"},
192191
extra_body={"key": "value"},

0 commit comments

Comments
 (0)