Skip to content

Commit 1d98bb1

Browse files
feat(network-policy): add network policies to api
1 parent 91854d5 commit 1d98bb1

21 files changed

Lines changed: 1552 additions & 78 deletions

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 98
1+
configured_endpoints: 103
22
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-8ebd9dbfacb180ec9c980f5e46a814b0c8a3cb6063136db18780271d33a8dfa6.yml
33
openapi_spec_hash: 12d4edec72b722945bade9419636d63e
4-
config_hash: cb8534d20a68a49b92726bedd50f8bb1
4+
config_hash: ec63e62d4660c9c924b39a8671c2fdb1

api.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
```python
44
from runloop_api_client.types import (
55
AfterIdle,
6+
AgentMount,
67
AgentSource,
78
CodeMountParameters,
89
LaunchParameters,
910
Mount,
11+
ObjectMount,
1012
RunProfile,
1113
)
1214
```
@@ -352,3 +354,24 @@ Methods:
352354
- <code title="post /v1/secrets/{name}">client.secrets.<a href="./src/runloop_api_client/resources/secrets.py">update</a>(name, \*\*<a href="src/runloop_api_client/types/secret_update_params.py">params</a>) -> <a href="./src/runloop_api_client/types/secret_view.py">SecretView</a></code>
353355
- <code title="get /v1/secrets">client.secrets.<a href="./src/runloop_api_client/resources/secrets.py">list</a>(\*\*<a href="src/runloop_api_client/types/secret_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/secret_list_view.py">SecretListView</a></code>
354356
- <code title="post /v1/secrets/{name}/delete">client.secrets.<a href="./src/runloop_api_client/resources/secrets.py">delete</a>(name) -> <a href="./src/runloop_api_client/types/secret_view.py">SecretView</a></code>
357+
358+
# NetworkPolicies
359+
360+
Types:
361+
362+
```python
363+
from runloop_api_client.types import (
364+
NetworkPolicyCreateParameters,
365+
NetworkPolicyListView,
366+
NetworkPolicyUpdateParameters,
367+
NetworkPolicyView,
368+
)
369+
```
370+
371+
Methods:
372+
373+
- <code title="post /v1/network-policies">client.network_policies.<a href="./src/runloop_api_client/resources/network_policies.py">create</a>(\*\*<a href="src/runloop_api_client/types/network_policy_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/network_policy_view.py">NetworkPolicyView</a></code>
374+
- <code title="get /v1/network-policies/{id}">client.network_policies.<a href="./src/runloop_api_client/resources/network_policies.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/network_policy_view.py">NetworkPolicyView</a></code>
375+
- <code title="post /v1/network-policies/{id}">client.network_policies.<a href="./src/runloop_api_client/resources/network_policies.py">update</a>(id, \*\*<a href="src/runloop_api_client/types/network_policy_update_params.py">params</a>) -> <a href="./src/runloop_api_client/types/network_policy_view.py">NetworkPolicyView</a></code>
376+
- <code title="get /v1/network-policies">client.network_policies.<a href="./src/runloop_api_client/resources/network_policies.py">list</a>(\*\*<a href="src/runloop_api_client/types/network_policy_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/network_policy_view.py">SyncNetworkPoliciesCursorIDPage[NetworkPolicyView]</a></code>
377+
- <code title="post /v1/network-policies/{id}/delete">client.network_policies.<a href="./src/runloop_api_client/resources/network_policies.py">delete</a>(id) -> <a href="./src/runloop_api_client/types/network_policy_view.py">NetworkPolicyView</a></code>

src/runloop_api_client/_client.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,23 @@
3131
)
3232

3333
if TYPE_CHECKING:
34-
from .resources import agents, objects, secrets, devboxes, scenarios, benchmarks, blueprints, repositories
34+
from .resources import (
35+
agents,
36+
objects,
37+
secrets,
38+
devboxes,
39+
scenarios,
40+
benchmarks,
41+
blueprints,
42+
repositories,
43+
network_policies,
44+
)
3545
from .resources.agents import AgentsResource, AsyncAgentsResource
3646
from .resources.objects import ObjectsResource, AsyncObjectsResource
3747
from .resources.secrets import SecretsResource, AsyncSecretsResource
3848
from .resources.blueprints import BlueprintsResource, AsyncBlueprintsResource
3949
from .resources.repositories import RepositoriesResource, AsyncRepositoriesResource
50+
from .resources.network_policies import NetworkPoliciesResource, AsyncNetworkPoliciesResource
4051
from .resources.devboxes.devboxes import DevboxesResource, AsyncDevboxesResource
4152
from .resources.scenarios.scenarios import ScenariosResource, AsyncScenariosResource
4253
from .resources.benchmarks.benchmarks import BenchmarksResource, AsyncBenchmarksResource
@@ -149,6 +160,12 @@ def secrets(self) -> SecretsResource:
149160

150161
return SecretsResource(self)
151162

163+
@cached_property
164+
def network_policies(self) -> NetworkPoliciesResource:
165+
from .resources.network_policies import NetworkPoliciesResource
166+
167+
return NetworkPoliciesResource(self)
168+
152169
@cached_property
153170
def with_raw_response(self) -> RunloopWithRawResponse:
154171
return RunloopWithRawResponse(self)
@@ -367,6 +384,12 @@ def secrets(self) -> AsyncSecretsResource:
367384

368385
return AsyncSecretsResource(self)
369386

387+
@cached_property
388+
def network_policies(self) -> AsyncNetworkPoliciesResource:
389+
from .resources.network_policies import AsyncNetworkPoliciesResource
390+
391+
return AsyncNetworkPoliciesResource(self)
392+
370393
@cached_property
371394
def with_raw_response(self) -> AsyncRunloopWithRawResponse:
372395
return AsyncRunloopWithRawResponse(self)
@@ -534,6 +557,12 @@ def secrets(self) -> secrets.SecretsResourceWithRawResponse:
534557

535558
return SecretsResourceWithRawResponse(self._client.secrets)
536559

560+
@cached_property
561+
def network_policies(self) -> network_policies.NetworkPoliciesResourceWithRawResponse:
562+
from .resources.network_policies import NetworkPoliciesResourceWithRawResponse
563+
564+
return NetworkPoliciesResourceWithRawResponse(self._client.network_policies)
565+
537566

538567
class AsyncRunloopWithRawResponse:
539568
_client: AsyncRunloop
@@ -589,6 +618,12 @@ def secrets(self) -> secrets.AsyncSecretsResourceWithRawResponse:
589618

590619
return AsyncSecretsResourceWithRawResponse(self._client.secrets)
591620

621+
@cached_property
622+
def network_policies(self) -> network_policies.AsyncNetworkPoliciesResourceWithRawResponse:
623+
from .resources.network_policies import AsyncNetworkPoliciesResourceWithRawResponse
624+
625+
return AsyncNetworkPoliciesResourceWithRawResponse(self._client.network_policies)
626+
592627

593628
class RunloopWithStreamedResponse:
594629
_client: Runloop
@@ -644,6 +679,12 @@ def secrets(self) -> secrets.SecretsResourceWithStreamingResponse:
644679

645680
return SecretsResourceWithStreamingResponse(self._client.secrets)
646681

682+
@cached_property
683+
def network_policies(self) -> network_policies.NetworkPoliciesResourceWithStreamingResponse:
684+
from .resources.network_policies import NetworkPoliciesResourceWithStreamingResponse
685+
686+
return NetworkPoliciesResourceWithStreamingResponse(self._client.network_policies)
687+
647688

648689
class AsyncRunloopWithStreamedResponse:
649690
_client: AsyncRunloop
@@ -699,6 +740,12 @@ def secrets(self) -> secrets.AsyncSecretsResourceWithStreamingResponse:
699740

700741
return AsyncSecretsResourceWithStreamingResponse(self._client.secrets)
701742

743+
@cached_property
744+
def network_policies(self) -> network_policies.AsyncNetworkPoliciesResourceWithStreamingResponse:
745+
from .resources.network_policies import AsyncNetworkPoliciesResourceWithStreamingResponse
746+
747+
return AsyncNetworkPoliciesResourceWithStreamingResponse(self._client.network_policies)
748+
702749

703750
Client = Runloop
704751

src/runloop_api_client/pagination.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
"AsyncScenarioScorersCursorIDPage",
2929
"SyncObjectsCursorIDPage",
3030
"AsyncObjectsCursorIDPage",
31+
"SyncNetworkPoliciesCursorIDPage",
32+
"AsyncNetworkPoliciesCursorIDPage",
3133
]
3234

3335
_T = TypeVar("_T")
@@ -88,6 +90,11 @@ class ObjectsCursorIDPageItem(Protocol):
8890
id: str
8991

9092

93+
@runtime_checkable
94+
class NetworkPoliciesCursorIDPageItem(Protocol):
95+
id: str
96+
97+
9198
class SyncBlueprintsCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
9299
blueprints: List[_T]
93100
has_more: Optional[bool] = None
@@ -834,3 +841,71 @@ def next_page_info(self) -> Optional[PageInfo]:
834841
return None
835842

836843
return PageInfo(params={"starting_after": item.id})
844+
845+
846+
class SyncNetworkPoliciesCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
847+
network_policies: List[_T]
848+
has_more: Optional[bool] = None
849+
total_count: Optional[int] = None
850+
851+
@override
852+
def _get_page_items(self) -> List[_T]:
853+
network_policies = self.network_policies
854+
if not network_policies:
855+
return []
856+
return network_policies
857+
858+
@override
859+
def has_next_page(self) -> bool:
860+
has_more = self.has_more
861+
if has_more is not None and has_more is False:
862+
return False
863+
864+
return super().has_next_page()
865+
866+
@override
867+
def next_page_info(self) -> Optional[PageInfo]:
868+
network_policies = self.network_policies
869+
if not network_policies:
870+
return None
871+
872+
item = cast(Any, network_policies[-1])
873+
if not isinstance(item, NetworkPoliciesCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
874+
# TODO emit warning log
875+
return None
876+
877+
return PageInfo(params={"starting_after": item.id})
878+
879+
880+
class AsyncNetworkPoliciesCursorIDPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
881+
network_policies: List[_T]
882+
has_more: Optional[bool] = None
883+
total_count: Optional[int] = None
884+
885+
@override
886+
def _get_page_items(self) -> List[_T]:
887+
network_policies = self.network_policies
888+
if not network_policies:
889+
return []
890+
return network_policies
891+
892+
@override
893+
def has_next_page(self) -> bool:
894+
has_more = self.has_more
895+
if has_more is not None and has_more is False:
896+
return False
897+
898+
return super().has_next_page()
899+
900+
@override
901+
def next_page_info(self) -> Optional[PageInfo]:
902+
network_policies = self.network_policies
903+
if not network_policies:
904+
return None
905+
906+
item = cast(Any, network_policies[-1])
907+
if not isinstance(item, NetworkPoliciesCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
908+
# TODO emit warning log
909+
return None
910+
911+
return PageInfo(params={"starting_after": item.id})

src/runloop_api_client/resources/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@
6464
RepositoriesResourceWithStreamingResponse,
6565
AsyncRepositoriesResourceWithStreamingResponse,
6666
)
67+
from .network_policies import (
68+
NetworkPoliciesResource,
69+
AsyncNetworkPoliciesResource,
70+
NetworkPoliciesResourceWithRawResponse,
71+
AsyncNetworkPoliciesResourceWithRawResponse,
72+
NetworkPoliciesResourceWithStreamingResponse,
73+
AsyncNetworkPoliciesResourceWithStreamingResponse,
74+
)
6775

6876
__all__ = [
6977
"BenchmarksResource",
@@ -114,4 +122,10 @@
114122
"AsyncSecretsResourceWithRawResponse",
115123
"SecretsResourceWithStreamingResponse",
116124
"AsyncSecretsResourceWithStreamingResponse",
125+
"NetworkPoliciesResource",
126+
"AsyncNetworkPoliciesResource",
127+
"NetworkPoliciesResourceWithRawResponse",
128+
"AsyncNetworkPoliciesResourceWithRawResponse",
129+
"NetworkPoliciesResourceWithStreamingResponse",
130+
"AsyncNetworkPoliciesResourceWithStreamingResponse",
117131
]

0 commit comments

Comments
 (0)