Skip to content

Commit a74dcd4

Browse files
committed
cp dines
1 parent 74db814 commit a74dcd4

13 files changed

Lines changed: 755 additions & 3 deletions

File tree

src/runloop_api_client/sdk/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
BenchmarkOps,
1616
BlueprintOps,
1717
StorageObjectOps,
18+
NetworkPolicyOps,
1819
)
1920
from .agent import Agent
2021
from ._types import ScenarioPreview
@@ -28,6 +29,7 @@
2829
AsyncBenchmarkOps,
2930
AsyncBlueprintOps,
3031
AsyncStorageObjectOps,
32+
AsyncNetworkPolicyOps,
3133
)
3234
from .devbox import Devbox, NamedShell
3335
from .scorer import Scorer
@@ -44,6 +46,7 @@
4446
from .async_scenario import AsyncScenario
4547
from .async_snapshot import AsyncSnapshot
4648
from .storage_object import StorageObject
49+
from .network_policy import NetworkPolicy
4750
from .async_benchmark import AsyncBenchmark
4851
from .async_blueprint import AsyncBlueprint
4952
from .async_execution import AsyncExecution
@@ -52,6 +55,7 @@
5255
from .async_scenario_run import AsyncScenarioRun
5356
from .async_benchmark_run import AsyncBenchmarkRun
5457
from .async_storage_object import AsyncStorageObject
58+
from .async_network_policy import AsyncNetworkPolicy
5559
from .async_execution_result import AsyncExecutionResult
5660
from .async_scenario_builder import AsyncScenarioBuilder
5761

@@ -76,6 +80,8 @@
7680
"AsyncSnapshotOps",
7781
"StorageObjectOps",
7882
"AsyncStorageObjectOps",
83+
"NetworkPolicyOps",
84+
"AsyncNetworkPolicyOps",
7985
# Resource classes
8086
"Agent",
8187
"AsyncAgent",
@@ -104,6 +110,8 @@
104110
"AsyncSnapshot",
105111
"StorageObject",
106112
"AsyncStorageObject",
113+
"NetworkPolicy",
114+
"AsyncNetworkPolicy",
107115
"NamedShell",
108116
"AsyncNamedShell",
109117
]

src/runloop_api_client/sdk/_types.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
DevboxDownloadFileParams,
2424
DevboxRemoveTunnelParams,
2525
DevboxSnapshotDiskParams,
26+
NetworkPolicyListParams,
2627
DevboxReadFileContentsParams,
28+
NetworkPolicyCreateParams,
29+
NetworkPolicyUpdateParams,
2730
DevboxWriteFileContentsParams,
2831
)
2932
from .._types import Body, Query, Headers, Timeout, NotGiven
@@ -236,3 +239,15 @@ class SDKBenchmarkListRunsParams(RunSelfListParams, BaseRequestOptions):
236239

237240
class SDKBenchmarkRunListScenarioRunsParams(RunListScenarioRunsParams, BaseRequestOptions):
238241
pass
242+
243+
244+
class SDKNetworkPolicyCreateParams(NetworkPolicyCreateParams, LongRequestOptions):
245+
pass
246+
247+
248+
class SDKNetworkPolicyListParams(NetworkPolicyListParams, BaseRequestOptions):
249+
pass
250+
251+
252+
class SDKNetworkPolicyUpdateParams(NetworkPolicyUpdateParams, LongRequestOptions):
253+
pass

src/runloop_api_client/sdk/async_.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
SDKBenchmarkCreateParams,
2727
SDKBlueprintCreateParams,
2828
SDKDiskSnapshotListParams,
29+
SDKNetworkPolicyListParams,
30+
SDKNetworkPolicyCreateParams,
2931
SDKDevboxCreateFromImageParams,
3032
)
3133
from .._types import Timeout, NotGiven, not_given
@@ -40,6 +42,7 @@
4042
from .async_blueprint import AsyncBlueprint
4143
from ..lib.context_loader import TarFilter, build_directory_tar
4244
from .async_storage_object import AsyncStorageObject
45+
from .async_network_policy import AsyncNetworkPolicy
4346
from .async_scenario_builder import AsyncScenarioBuilder
4447
from ..types.object_create_params import ContentType
4548
from ..types.shared_params.agent_source import Git, Npm, Pip, Object
@@ -867,6 +870,60 @@ async def list(self, **params: Unpack[SDKBenchmarkListParams]) -> list[AsyncBenc
867870
return [AsyncBenchmark(self._client, item.id) for item in page.benchmarks]
868871

869872

873+
class AsyncNetworkPolicyOps:
874+
"""High-level async manager for creating and managing network policies.
875+
876+
Accessed via ``runloop.network_policy`` from :class:`AsyncRunloopSDK`, provides
877+
coroutines to create, retrieve, update, delete, and list network policies.
878+
879+
Example:
880+
>>> runloop = AsyncRunloopSDK()
881+
>>> policy = await runloop.network_policy.create(
882+
... name="my-policy",
883+
... allowed_hostnames=["github.com", "*.npmjs.org"],
884+
... )
885+
>>> policies = await runloop.network_policy.list()
886+
"""
887+
888+
def __init__(self, client: AsyncRunloop) -> None:
889+
"""Initialize AsyncNetworkPolicyOps.
890+
891+
:param client: AsyncRunloop client instance
892+
:type client: AsyncRunloop
893+
"""
894+
self._client = client
895+
896+
async def create(self, **params: Unpack[SDKNetworkPolicyCreateParams]) -> AsyncNetworkPolicy:
897+
"""Create a new network policy.
898+
899+
:param params: See :typeddict:`~runloop_api_client.sdk._types.SDKNetworkPolicyCreateParams` for available parameters
900+
:return: The newly created network policy
901+
:rtype: AsyncNetworkPolicy
902+
"""
903+
response = await self._client.network_policies.create(**params)
904+
return AsyncNetworkPolicy(self._client, response.id)
905+
906+
def from_id(self, network_policy_id: str) -> AsyncNetworkPolicy:
907+
"""Get an AsyncNetworkPolicy instance for an existing network policy ID.
908+
909+
:param network_policy_id: ID of the network policy
910+
:type network_policy_id: str
911+
:return: AsyncNetworkPolicy instance for the given ID
912+
:rtype: AsyncNetworkPolicy
913+
"""
914+
return AsyncNetworkPolicy(self._client, network_policy_id)
915+
916+
async def list(self, **params: Unpack[SDKNetworkPolicyListParams]) -> list[AsyncNetworkPolicy]:
917+
"""List all network policies, optionally filtered by parameters.
918+
919+
:param params: See :typeddict:`~runloop_api_client.sdk._types.SDKNetworkPolicyListParams` for available parameters
920+
:return: List of network policies
921+
:rtype: list[AsyncNetworkPolicy]
922+
"""
923+
page = self._client.network_policies.list(**params)
924+
return [AsyncNetworkPolicy(self._client, item.id) async for item in page]
925+
926+
870927
class AsyncRunloopSDK:
871928
"""High-level asynchronous entry point for the Runloop SDK.
872929
@@ -892,6 +949,8 @@ class AsyncRunloopSDK:
892949
:vartype snapshot: AsyncSnapshotOps
893950
:ivar storage_object: High-level async interface for storage object management
894951
:vartype storage_object: AsyncStorageObjectOps
952+
:ivar network_policy: High-level async interface for network policy management
953+
:vartype network_policy: AsyncNetworkPolicyOps
895954
896955
Example:
897956
>>> runloop = AsyncRunloopSDK() # Uses RUNLOOP_API_KEY env var
@@ -906,6 +965,7 @@ class AsyncRunloopSDK:
906965
benchmark: AsyncBenchmarkOps
907966
devbox: AsyncDevboxOps
908967
blueprint: AsyncBlueprintOps
968+
network_policy: AsyncNetworkPolicyOps
909969
scenario: AsyncScenarioOps
910970
scorer: AsyncScorerOps
911971
snapshot: AsyncSnapshotOps
@@ -953,6 +1013,7 @@ def __init__(
9531013
self.benchmark = AsyncBenchmarkOps(self.api)
9541014
self.devbox = AsyncDevboxOps(self.api)
9551015
self.blueprint = AsyncBlueprintOps(self.api)
1016+
self.network_policy = AsyncNetworkPolicyOps(self.api)
9561017
self.scenario = AsyncScenarioOps(self.api)
9571018
self.scorer = AsyncScorerOps(self.api)
9581019
self.snapshot = AsyncSnapshotOps(self.api)
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
"""NetworkPolicy resource class for asynchronous operations."""
2+
3+
from __future__ import annotations
4+
5+
from typing import Optional
6+
7+
from typing_extensions import Unpack, override
8+
9+
from .._types import SequenceNotStr
10+
from ._types import BaseRequestOptions, LongRequestOptions
11+
from .._client import AsyncRunloop
12+
from ..types.network_policy_view import NetworkPolicyView
13+
14+
15+
class AsyncNetworkPolicy:
16+
"""Asynchronous wrapper around a network policy resource."""
17+
18+
def __init__(
19+
self,
20+
client: AsyncRunloop,
21+
network_policy_id: str,
22+
) -> None:
23+
"""Initialize the wrapper.
24+
25+
:param client: Generated AsyncRunloop client
26+
:type client: AsyncRunloop
27+
:param network_policy_id: NetworkPolicy ID returned by the API
28+
:type network_policy_id: str
29+
"""
30+
self._client = client
31+
self._id = network_policy_id
32+
33+
@override
34+
def __repr__(self) -> str:
35+
return f"<AsyncNetworkPolicy id={self._id!r}>"
36+
37+
@property
38+
def id(self) -> str:
39+
"""Return the network policy ID.
40+
41+
:return: Unique network policy ID
42+
:rtype: str
43+
"""
44+
return self._id
45+
46+
async def get_info(
47+
self,
48+
**options: Unpack[BaseRequestOptions],
49+
) -> NetworkPolicyView:
50+
"""Retrieve the latest network policy details.
51+
52+
:param options: Optional request configuration
53+
:return: API response describing the network policy
54+
:rtype: NetworkPolicyView
55+
"""
56+
return await self._client.network_policies.retrieve(
57+
self._id,
58+
**options,
59+
)
60+
61+
async def update(
62+
self,
63+
*,
64+
allow_all: Optional[bool] = None,
65+
allow_devbox_to_devbox: Optional[bool] = None,
66+
allowed_hostnames: Optional[SequenceNotStr[str]] = None,
67+
description: Optional[str] = None,
68+
name: Optional[str] = None,
69+
**options: Unpack[LongRequestOptions],
70+
) -> NetworkPolicyView:
71+
"""Update the network policy.
72+
73+
:param allow_all: If true, all egress traffic is allowed (ALLOW_ALL policy)
74+
:type allow_all: Optional[bool]
75+
:param allow_devbox_to_devbox: If true, allows traffic between devboxes via tunnels
76+
:type allow_devbox_to_devbox: Optional[bool]
77+
:param allowed_hostnames: DNS-based allow list with wildcard support
78+
:type allowed_hostnames: Optional[SequenceNotStr[str]]
79+
:param description: Updated description for the NetworkPolicy
80+
:type description: Optional[str]
81+
:param name: Updated human-readable name for the NetworkPolicy
82+
:type name: Optional[str]
83+
:param options: Optional long-running request configuration
84+
:return: Updated network policy view
85+
:rtype: NetworkPolicyView
86+
"""
87+
return await self._client.network_policies.update(
88+
self._id,
89+
allow_all=allow_all,
90+
allow_devbox_to_devbox=allow_devbox_to_devbox,
91+
allowed_hostnames=allowed_hostnames,
92+
description=description,
93+
name=name,
94+
**options,
95+
)
96+
97+
async def delete(
98+
self,
99+
**options: Unpack[LongRequestOptions],
100+
) -> NetworkPolicyView:
101+
"""Delete the network policy.
102+
103+
:param options: Optional long-running request configuration
104+
:return: API response acknowledging deletion
105+
:rtype: NetworkPolicyView
106+
"""
107+
return await self._client.network_policies.delete(
108+
self._id,
109+
**options,
110+
)

0 commit comments

Comments
 (0)