Skip to content

Commit 302f52d

Browse files
feat(cloud): add replace method for GPU baremetal cluster server
1 parent 2a09961 commit 302f52d

4 files changed

Lines changed: 124 additions & 56 deletions

File tree

.stats.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 658
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore/gcore-05944c6511995a38bc1b5220f89972a3b95d8ba0fafe7d130028a531308ecc09.yml
1+
configured_endpoints: 659
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore/gcore-57ddb0cb059d0bfb72681af53e70b8d96d23df71025efbed5ff895949191e09a.yml
33
openapi_spec_hash: 56b7f9ac85a32a2db9de669906c2de81
4-
config_hash: d9d6130b73734fc0909ceb1320c74917
4+
config_hash: dfd7c029cbc3fb95b9fd5a3df7df1535

src/gcore/resources/cloud/api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,7 @@ Methods:
843843
- <code title="post /cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/powercycle">client.cloud.gpu_baremetal.clusters.servers.<a href="./src/gcore/resources/cloud/gpu_baremetal/clusters/servers.py">powercycle</a>(instance_id, \*, project_id, region_id) -> <a href="./src/gcore/types/cloud/gpu_baremetal/clusters/gpu_baremetal_cluster_server_v1.py">GPUBaremetalClusterServerV1</a></code>
844844
- <code title="post /cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/reboot">client.cloud.gpu_baremetal.clusters.servers.<a href="./src/gcore/resources/cloud/gpu_baremetal/clusters/servers.py">reboot</a>(instance_id, \*, project_id, region_id) -> <a href="./src/gcore/types/cloud/gpu_baremetal/clusters/gpu_baremetal_cluster_server_v1.py">GPUBaremetalClusterServerV1</a></code>
845845
- <code title="post /cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers/{server_id}/rebuild">client.cloud.gpu_baremetal.clusters.servers.<a href="./src/gcore/resources/cloud/gpu_baremetal/clusters/servers.py">rebuild</a>(server_id, \*, project_id, region_id, cluster_id) -> <a href="./src/gcore/types/cloud/task_id_list.py">TaskIDList</a></code>
846+
- <code title="post /cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers/{server_id}/replace">client.cloud.gpu_baremetal.clusters.servers.<a href="./src/gcore/resources/cloud/gpu_baremetal/clusters/servers.py">replace</a>(server_id, \*, project_id, region_id, cluster_id) -> <a href="./src/gcore/types/cloud/task_id_list.py">TaskIDList</a></code>
846847

847848
#### Flavors
848849

src/gcore/resources/cloud/gpu_baremetal/clusters/servers.py

Lines changed: 4 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -856,47 +856,6 @@ async def rebuild(
856856
cast_to=TaskIDList,
857857
)
858858

859-
async def delete_and_poll(
860-
self,
861-
instance_id: str,
862-
*,
863-
project_id: int | None = None,
864-
region_id: int | None = None,
865-
cluster_id: str,
866-
delete_floatings: bool | Omit = omit,
867-
polling_interval_seconds: int | Omit = omit,
868-
polling_timeout_seconds: int | Omit = omit,
869-
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
870-
# The extra values given here take precedence over values defined on the client or passed to this method.
871-
extra_headers: Headers | None = None,
872-
extra_query: Query | None = None,
873-
extra_body: Body | None = None,
874-
timeout: float | httpx.Timeout | None | NotGiven = not_given,
875-
) -> None:
876-
"""
877-
Delete a bare metal GPU server from cluster and poll for the result. Only the first task will be polled. If you need to poll more tasks, use the `tasks.poll` method.
878-
"""
879-
response = await self.delete(
880-
instance_id=instance_id,
881-
project_id=project_id,
882-
region_id=region_id,
883-
cluster_id=cluster_id,
884-
delete_floatings=delete_floatings,
885-
extra_headers=extra_headers,
886-
extra_query=extra_query,
887-
extra_body=extra_body,
888-
timeout=timeout,
889-
)
890-
if not response.tasks or len(response.tasks) < 1:
891-
raise ValueError("Expected at least one task to be created")
892-
await self._client.cloud.tasks.poll(
893-
response.tasks[0],
894-
extra_headers=extra_headers,
895-
extra_query=extra_query,
896-
extra_body=extra_body,
897-
polling_interval_seconds=polling_interval_seconds,
898-
polling_timeout_seconds=polling_timeout_seconds,
899-
)
900859

901860

902861
class ServersResourceWithRawResponse:
@@ -921,9 +880,7 @@ def __init__(self, servers: ServersResource) -> None:
921880
self.rebuild = to_raw_response_wrapper(
922881
servers.rebuild,
923882
)
924-
self.delete_and_poll = to_raw_response_wrapper(
925-
servers.delete_and_poll,
926-
)
883+
927884

928885

929886
class AsyncServersResourceWithRawResponse:
@@ -948,9 +905,7 @@ def __init__(self, servers: AsyncServersResource) -> None:
948905
self.rebuild = async_to_raw_response_wrapper(
949906
servers.rebuild,
950907
)
951-
self.delete_and_poll = async_to_raw_response_wrapper(
952-
servers.delete_and_poll,
953-
)
908+
954909

955910

956911
class ServersResourceWithStreamingResponse:
@@ -975,9 +930,7 @@ def __init__(self, servers: ServersResource) -> None:
975930
self.rebuild = to_streamed_response_wrapper(
976931
servers.rebuild,
977932
)
978-
self.delete_and_poll = to_streamed_response_wrapper(
979-
servers.delete_and_poll,
980-
)
933+
981934

982935

983936
class AsyncServersResourceWithStreamingResponse:
@@ -1002,6 +955,4 @@ def __init__(self, servers: AsyncServersResource) -> None:
1002955
self.rebuild = async_to_streamed_response_wrapper(
1003956
servers.rebuild,
1004957
)
1005-
self.delete_and_poll = async_to_streamed_response_wrapper(
1006-
servers.delete_and_poll,
1007-
)
958+

tests/api_resources/cloud/gpu_baremetal/clusters/test_servers.py

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,64 @@ def test_path_params_rebuild(self, client: Gcore) -> None:
352352
cluster_id="1aaaab48-10d0-46d9-80cc-85209284ceb4",
353353
)
354354

355+
@parametrize
356+
def test_method_replace(self, client: Gcore) -> None:
357+
server = client.cloud.gpu_baremetal.clusters.servers.replace(
358+
server_id="f1c1eeb6-1834-48c9-a7b0-daafce64872b",
359+
project_id=1,
360+
region_id=7,
361+
cluster_id="1aaaab48-10d0-46d9-80cc-85209284ceb4",
362+
)
363+
assert_matches_type(TaskIDList, server, path=["response"])
364+
365+
@parametrize
366+
def test_raw_response_replace(self, client: Gcore) -> None:
367+
response = client.cloud.gpu_baremetal.clusters.servers.with_raw_response.replace(
368+
server_id="f1c1eeb6-1834-48c9-a7b0-daafce64872b",
369+
project_id=1,
370+
region_id=7,
371+
cluster_id="1aaaab48-10d0-46d9-80cc-85209284ceb4",
372+
)
373+
374+
assert response.is_closed is True
375+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
376+
server = response.parse()
377+
assert_matches_type(TaskIDList, server, path=["response"])
378+
379+
@parametrize
380+
def test_streaming_response_replace(self, client: Gcore) -> None:
381+
with client.cloud.gpu_baremetal.clusters.servers.with_streaming_response.replace(
382+
server_id="f1c1eeb6-1834-48c9-a7b0-daafce64872b",
383+
project_id=1,
384+
region_id=7,
385+
cluster_id="1aaaab48-10d0-46d9-80cc-85209284ceb4",
386+
) as response:
387+
assert not response.is_closed
388+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
389+
390+
server = response.parse()
391+
assert_matches_type(TaskIDList, server, path=["response"])
392+
393+
assert cast(Any, response.is_closed) is True
394+
395+
@parametrize
396+
def test_path_params_replace(self, client: Gcore) -> None:
397+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `cluster_id` but received ''"):
398+
client.cloud.gpu_baremetal.clusters.servers.with_raw_response.replace(
399+
server_id="f1c1eeb6-1834-48c9-a7b0-daafce64872b",
400+
project_id=1,
401+
region_id=7,
402+
cluster_id="",
403+
)
404+
405+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `server_id` but received ''"):
406+
client.cloud.gpu_baremetal.clusters.servers.with_raw_response.replace(
407+
server_id="",
408+
project_id=1,
409+
region_id=7,
410+
cluster_id="1aaaab48-10d0-46d9-80cc-85209284ceb4",
411+
)
412+
355413

356414
class TestAsyncServers:
357415
parametrize = pytest.mark.parametrize(
@@ -686,3 +744,61 @@ async def test_path_params_rebuild(self, async_client: AsyncGcore) -> None:
686744
region_id=7,
687745
cluster_id="1aaaab48-10d0-46d9-80cc-85209284ceb4",
688746
)
747+
748+
@parametrize
749+
async def test_method_replace(self, async_client: AsyncGcore) -> None:
750+
server = await async_client.cloud.gpu_baremetal.clusters.servers.replace(
751+
server_id="f1c1eeb6-1834-48c9-a7b0-daafce64872b",
752+
project_id=1,
753+
region_id=7,
754+
cluster_id="1aaaab48-10d0-46d9-80cc-85209284ceb4",
755+
)
756+
assert_matches_type(TaskIDList, server, path=["response"])
757+
758+
@parametrize
759+
async def test_raw_response_replace(self, async_client: AsyncGcore) -> None:
760+
response = await async_client.cloud.gpu_baremetal.clusters.servers.with_raw_response.replace(
761+
server_id="f1c1eeb6-1834-48c9-a7b0-daafce64872b",
762+
project_id=1,
763+
region_id=7,
764+
cluster_id="1aaaab48-10d0-46d9-80cc-85209284ceb4",
765+
)
766+
767+
assert response.is_closed is True
768+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
769+
server = await response.parse()
770+
assert_matches_type(TaskIDList, server, path=["response"])
771+
772+
@parametrize
773+
async def test_streaming_response_replace(self, async_client: AsyncGcore) -> None:
774+
async with async_client.cloud.gpu_baremetal.clusters.servers.with_streaming_response.replace(
775+
server_id="f1c1eeb6-1834-48c9-a7b0-daafce64872b",
776+
project_id=1,
777+
region_id=7,
778+
cluster_id="1aaaab48-10d0-46d9-80cc-85209284ceb4",
779+
) as response:
780+
assert not response.is_closed
781+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
782+
783+
server = await response.parse()
784+
assert_matches_type(TaskIDList, server, path=["response"])
785+
786+
assert cast(Any, response.is_closed) is True
787+
788+
@parametrize
789+
async def test_path_params_replace(self, async_client: AsyncGcore) -> None:
790+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `cluster_id` but received ''"):
791+
await async_client.cloud.gpu_baremetal.clusters.servers.with_raw_response.replace(
792+
server_id="f1c1eeb6-1834-48c9-a7b0-daafce64872b",
793+
project_id=1,
794+
region_id=7,
795+
cluster_id="",
796+
)
797+
798+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `server_id` but received ''"):
799+
await async_client.cloud.gpu_baremetal.clusters.servers.with_raw_response.replace(
800+
server_id="",
801+
project_id=1,
802+
region_id=7,
803+
cluster_id="1aaaab48-10d0-46d9-80cc-85209284ceb4",
804+
)

0 commit comments

Comments
 (0)