From 5c6f9bcfbd18fc5e22a4afeafe91c8d6a9587cb1 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 17:35:31 +0000 Subject: [PATCH 01/25] fix(pydantic): do not pass `by_alias` unless set --- src/gcore/_compat.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/gcore/_compat.py b/src/gcore/_compat.py index 786ff42a..e6690a4f 100644 --- a/src/gcore/_compat.py +++ b/src/gcore/_compat.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, Union, Generic, TypeVar, Callable, cast, overload from datetime import date, datetime -from typing_extensions import Self, Literal +from typing_extensions import Self, Literal, TypedDict import pydantic from pydantic.fields import FieldInfo @@ -131,6 +131,10 @@ def model_json(model: pydantic.BaseModel, *, indent: int | None = None) -> str: return model.model_dump_json(indent=indent) +class _ModelDumpKwargs(TypedDict, total=False): + by_alias: bool + + def model_dump( model: pydantic.BaseModel, *, @@ -142,6 +146,9 @@ def model_dump( by_alias: bool | None = None, ) -> dict[str, Any]: if (not PYDANTIC_V1) or hasattr(model, "model_dump"): + kwargs: _ModelDumpKwargs = {} + if by_alias is not None: + kwargs["by_alias"] = by_alias return model.model_dump( mode=mode, exclude=exclude, @@ -149,7 +156,7 @@ def model_dump( exclude_defaults=exclude_defaults, # warnings are not supported in Pydantic v1 warnings=True if PYDANTIC_V1 else warnings, - by_alias=by_alias, + **kwargs, ) return cast( "dict[str, Any]", From b31cabd05d4a00b17843e50cb04cd19b213c7841 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 19:04:11 +0000 Subject: [PATCH 02/25] fix(deps): bump minimum typing-extensions version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4dca5b5e..ad7f957e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ authors = [ dependencies = [ "httpx>=0.23.0, <1", "pydantic>=1.9.0, <3", - "typing-extensions>=4.10, <5", + "typing-extensions>=4.14, <5", "anyio>=3.5.0, <5", "distro>=1.7.0, <2", "sniffio", From 9d190fe9d244981df99f5b9bd2183de0b8f0bd1b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 20:47:57 +0000 Subject: [PATCH 03/25] chore(internal): tweak CI branches --- .github/workflows/ci.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c7e50d16..f4ad13d6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,12 +1,14 @@ name: CI on: push: - branches-ignore: - - 'generated' - - 'codegen/**' - - 'integrated/**' - - 'stl-preview-head/**' - - 'stl-preview-base/**' + branches: + - '**' + - '!integrated/**' + - '!stl-preview-head/**' + - '!stl-preview-base/**' + - '!generated' + - '!codegen/**' + - 'codegen/stl/**' pull_request: branches-ignore: - 'stl-preview-head/**' From 1f3ecde5335a35615da014f97ee6b5710b3d6306 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:47:49 +0000 Subject: [PATCH 04/25] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fe0aa393..2ae86dfd 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 650 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-b71ab0455d9c1c70763bfdb61190c0f3cc690dc92672a8375219d652c75e27ab.yml -openapi_spec_hash: 07c996ef2c5d53ef398770be192aaade +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-b55ecdc30557f904692eed320cb1b0f87532c0b3b33d7fe75486b91de54d9aa5.yml +openapi_spec_hash: f1d05cd6eec2d551bd8da21a7788aeef config_hash: 04626cc332f61b5896412323f83340f7 From 938f4aedb8f61a95628ceb111df6e716f3f8ca70 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 12:27:08 +0000 Subject: [PATCH 05/25] feat(api): aggregated API specs update --- .stats.yml | 4 +- src/gcore/resources/cloud/tasks.py | 82 ++++++++++++----------- src/gcore/types/cloud/task_list_params.py | 41 ++++++------ 3 files changed, 65 insertions(+), 62 deletions(-) diff --git a/.stats.yml b/.stats.yml index 2ae86dfd..acd1f4e5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 650 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-b55ecdc30557f904692eed320cb1b0f87532c0b3b33d7fe75486b91de54d9aa5.yml -openapi_spec_hash: f1d05cd6eec2d551bd8da21a7788aeef +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-47373f82df7a117f54d67450180eab62280ebda4a73470c98a2511ab776e51e2.yml +openapi_spec_hash: 5ac3f10ea6fc912220c3c193a3eebc75 config_hash: 04626cc332f61b5896412323f83340f7 diff --git a/src/gcore/resources/cloud/tasks.py b/src/gcore/resources/cloud/tasks.py index 810ab712..cead4247 100644 --- a/src/gcore/resources/cloud/tasks.py +++ b/src/gcore/resources/cloud/tasks.py @@ -166,28 +166,29 @@ def list( 'delete_snapshot', 'delete_subnet', 'delete_vm', 'delete_volume', 'detach_vm_interface', 'detach_volume', 'download_image', 'downscale_ai_cluster_gpu', 'downscale_gpu_virtual_cluster', 'extend_sfs', - 'extend_volume', 'failover_loadbalancer', 'hard_reboot_gpu_baremetal_cluster', - 'hard_reboot_gpu_baremetal_server', 'hard_reboot_gpu_virtual_cluster', - 'hard_reboot_gpu_virtual_server', 'hard_reboot_vm', 'patch_caas_container', - 'patch_dbaas_postgres_cluster', 'patch_faas_function', 'patch_faas_namespace', - 'patch_lblistener', 'patch_lbpool', 'put_into_server_group', 'put_l7rule', - 'rebuild_bm', 'rebuild_gpu_baremetal_cluster', 'rebuild_gpu_baremetal_node', + 'extend_volume', 'failover_loadbalancer', 'hard_reboot_bm', + 'hard_reboot_gpu_baremetal_cluster', 'hard_reboot_gpu_baremetal_server', + 'hard_reboot_gpu_virtual_cluster', 'hard_reboot_gpu_virtual_server', + 'hard_reboot_vm', 'patch_caas_container', 'patch_dbaas_postgres_cluster', + 'patch_faas_function', 'patch_faas_namespace', 'patch_lblistener', + 'patch_lbpool', 'put_into_server_group', 'put_l7rule', 'rebuild_bm', + 'rebuild_gpu_baremetal_cluster', 'rebuild_gpu_baremetal_node', 'rebuild_gpu_baremetal_server', 'remove_from_server_group', 'replace_lbmetadata', 'resize_k8s_cluster_v2', 'resize_loadbalancer', - 'resize_vm', 'resume_vm', 'revert_volume', 'soft_reboot_gpu_baremetal_cluster', - 'soft_reboot_gpu_baremetal_server', 'soft_reboot_gpu_virtual_cluster', - 'soft_reboot_gpu_virtual_server', 'soft_reboot_vm', - 'start_gpu_baremetal_cluster', 'start_gpu_baremetal_server', - 'start_gpu_virtual_cluster', 'start_gpu_virtual_server', 'start_vm', - 'stop_gpu_baremetal_cluster', 'stop_gpu_baremetal_server', - 'stop_gpu_virtual_cluster', 'stop_gpu_virtual_server', 'stop_vm', 'suspend_vm', - 'sync_private_flavors', 'update_ddos_profile', 'update_floating_ip', - 'update_inference_application', 'update_inference_instance', - 'update_k8s_cluster_v2', 'update_l7policy', 'update_lbmetadata', - 'update_loadbalancer', 'update_port_allowed_address_pairs', 'update_router', - 'update_security_group', 'update_sfs', 'update_tags_gpu_virtual_cluster', - 'upgrade_k8s_cluster_v2', 'upscale_ai_cluster_gpu', - 'upscale_gpu_virtual_cluster'] + 'resize_vm', 'resume_vm', 'revert_volume', 'soft_reboot_bm', + 'soft_reboot_gpu_baremetal_cluster', 'soft_reboot_gpu_baremetal_server', + 'soft_reboot_gpu_virtual_cluster', 'soft_reboot_gpu_virtual_server', + 'soft_reboot_vm', 'start_bm', 'start_gpu_baremetal_cluster', + 'start_gpu_baremetal_server', 'start_gpu_virtual_cluster', + 'start_gpu_virtual_server', 'start_vm', 'stop_bm', 'stop_gpu_baremetal_cluster', + 'stop_gpu_baremetal_server', 'stop_gpu_virtual_cluster', + 'stop_gpu_virtual_server', 'stop_vm', 'suspend_vm', 'sync_private_flavors', + 'update_ddos_profile', 'update_floating_ip', 'update_inference_application', + 'update_inference_instance', 'update_k8s_cluster_v2', 'update_l7policy', + 'update_lbmetadata', 'update_loadbalancer', 'update_port_allowed_address_pairs', + 'update_router', 'update_security_group', 'update_sfs', + 'update_tags_gpu_virtual_cluster', 'upgrade_k8s_cluster_v2', + 'upscale_ai_cluster_gpu', 'upscale_gpu_virtual_cluster'] to_timestamp: ISO formatted datetime string. Filter the tasks by creation date less than or equal to `to_timestamp` @@ -485,28 +486,29 @@ def list( 'delete_snapshot', 'delete_subnet', 'delete_vm', 'delete_volume', 'detach_vm_interface', 'detach_volume', 'download_image', 'downscale_ai_cluster_gpu', 'downscale_gpu_virtual_cluster', 'extend_sfs', - 'extend_volume', 'failover_loadbalancer', 'hard_reboot_gpu_baremetal_cluster', - 'hard_reboot_gpu_baremetal_server', 'hard_reboot_gpu_virtual_cluster', - 'hard_reboot_gpu_virtual_server', 'hard_reboot_vm', 'patch_caas_container', - 'patch_dbaas_postgres_cluster', 'patch_faas_function', 'patch_faas_namespace', - 'patch_lblistener', 'patch_lbpool', 'put_into_server_group', 'put_l7rule', - 'rebuild_bm', 'rebuild_gpu_baremetal_cluster', 'rebuild_gpu_baremetal_node', + 'extend_volume', 'failover_loadbalancer', 'hard_reboot_bm', + 'hard_reboot_gpu_baremetal_cluster', 'hard_reboot_gpu_baremetal_server', + 'hard_reboot_gpu_virtual_cluster', 'hard_reboot_gpu_virtual_server', + 'hard_reboot_vm', 'patch_caas_container', 'patch_dbaas_postgres_cluster', + 'patch_faas_function', 'patch_faas_namespace', 'patch_lblistener', + 'patch_lbpool', 'put_into_server_group', 'put_l7rule', 'rebuild_bm', + 'rebuild_gpu_baremetal_cluster', 'rebuild_gpu_baremetal_node', 'rebuild_gpu_baremetal_server', 'remove_from_server_group', 'replace_lbmetadata', 'resize_k8s_cluster_v2', 'resize_loadbalancer', - 'resize_vm', 'resume_vm', 'revert_volume', 'soft_reboot_gpu_baremetal_cluster', - 'soft_reboot_gpu_baremetal_server', 'soft_reboot_gpu_virtual_cluster', - 'soft_reboot_gpu_virtual_server', 'soft_reboot_vm', - 'start_gpu_baremetal_cluster', 'start_gpu_baremetal_server', - 'start_gpu_virtual_cluster', 'start_gpu_virtual_server', 'start_vm', - 'stop_gpu_baremetal_cluster', 'stop_gpu_baremetal_server', - 'stop_gpu_virtual_cluster', 'stop_gpu_virtual_server', 'stop_vm', 'suspend_vm', - 'sync_private_flavors', 'update_ddos_profile', 'update_floating_ip', - 'update_inference_application', 'update_inference_instance', - 'update_k8s_cluster_v2', 'update_l7policy', 'update_lbmetadata', - 'update_loadbalancer', 'update_port_allowed_address_pairs', 'update_router', - 'update_security_group', 'update_sfs', 'update_tags_gpu_virtual_cluster', - 'upgrade_k8s_cluster_v2', 'upscale_ai_cluster_gpu', - 'upscale_gpu_virtual_cluster'] + 'resize_vm', 'resume_vm', 'revert_volume', 'soft_reboot_bm', + 'soft_reboot_gpu_baremetal_cluster', 'soft_reboot_gpu_baremetal_server', + 'soft_reboot_gpu_virtual_cluster', 'soft_reboot_gpu_virtual_server', + 'soft_reboot_vm', 'start_bm', 'start_gpu_baremetal_cluster', + 'start_gpu_baremetal_server', 'start_gpu_virtual_cluster', + 'start_gpu_virtual_server', 'start_vm', 'stop_bm', 'stop_gpu_baremetal_cluster', + 'stop_gpu_baremetal_server', 'stop_gpu_virtual_cluster', + 'stop_gpu_virtual_server', 'stop_vm', 'suspend_vm', 'sync_private_flavors', + 'update_ddos_profile', 'update_floating_ip', 'update_inference_application', + 'update_inference_instance', 'update_k8s_cluster_v2', 'update_l7policy', + 'update_lbmetadata', 'update_loadbalancer', 'update_port_allowed_address_pairs', + 'update_router', 'update_security_group', 'update_sfs', + 'update_tags_gpu_virtual_cluster', 'upgrade_k8s_cluster_v2', + 'upscale_ai_cluster_gpu', 'upscale_gpu_virtual_cluster'] to_timestamp: ISO formatted datetime string. Filter the tasks by creation date less than or equal to `to_timestamp` diff --git a/src/gcore/types/cloud/task_list_params.py b/src/gcore/types/cloud/task_list_params.py index c9de3c07..1908fcca 100644 --- a/src/gcore/types/cloud/task_list_params.py +++ b/src/gcore/types/cloud/task_list_params.py @@ -85,28 +85,29 @@ class TaskListParams(TypedDict, total=False): 'delete_snapshot', 'delete_subnet', 'delete_vm', 'delete_volume', 'detach_vm_interface', 'detach_volume', 'download_image', 'downscale_ai_cluster_gpu', 'downscale_gpu_virtual_cluster', 'extend_sfs', - 'extend_volume', 'failover_loadbalancer', 'hard_reboot_gpu_baremetal_cluster', - 'hard_reboot_gpu_baremetal_server', 'hard_reboot_gpu_virtual_cluster', - 'hard_reboot_gpu_virtual_server', 'hard_reboot_vm', 'patch_caas_container', - 'patch_dbaas_postgres_cluster', 'patch_faas_function', 'patch_faas_namespace', - 'patch_lblistener', 'patch_lbpool', 'put_into_server_group', 'put_l7rule', - 'rebuild_bm', 'rebuild_gpu_baremetal_cluster', 'rebuild_gpu_baremetal_node', + 'extend_volume', 'failover_loadbalancer', 'hard_reboot_bm', + 'hard_reboot_gpu_baremetal_cluster', 'hard_reboot_gpu_baremetal_server', + 'hard_reboot_gpu_virtual_cluster', 'hard_reboot_gpu_virtual_server', + 'hard_reboot_vm', 'patch_caas_container', 'patch_dbaas_postgres_cluster', + 'patch_faas_function', 'patch_faas_namespace', 'patch_lblistener', + 'patch_lbpool', 'put_into_server_group', 'put_l7rule', 'rebuild_bm', + 'rebuild_gpu_baremetal_cluster', 'rebuild_gpu_baremetal_node', 'rebuild_gpu_baremetal_server', 'remove_from_server_group', 'replace_lbmetadata', 'resize_k8s_cluster_v2', 'resize_loadbalancer', - 'resize_vm', 'resume_vm', 'revert_volume', 'soft_reboot_gpu_baremetal_cluster', - 'soft_reboot_gpu_baremetal_server', 'soft_reboot_gpu_virtual_cluster', - 'soft_reboot_gpu_virtual_server', 'soft_reboot_vm', - 'start_gpu_baremetal_cluster', 'start_gpu_baremetal_server', - 'start_gpu_virtual_cluster', 'start_gpu_virtual_server', 'start_vm', - 'stop_gpu_baremetal_cluster', 'stop_gpu_baremetal_server', - 'stop_gpu_virtual_cluster', 'stop_gpu_virtual_server', 'stop_vm', 'suspend_vm', - 'sync_private_flavors', 'update_ddos_profile', 'update_floating_ip', - 'update_inference_application', 'update_inference_instance', - 'update_k8s_cluster_v2', 'update_l7policy', 'update_lbmetadata', - 'update_loadbalancer', 'update_port_allowed_address_pairs', 'update_router', - 'update_security_group', 'update_sfs', 'update_tags_gpu_virtual_cluster', - 'upgrade_k8s_cluster_v2', 'upscale_ai_cluster_gpu', - 'upscale_gpu_virtual_cluster'] + 'resize_vm', 'resume_vm', 'revert_volume', 'soft_reboot_bm', + 'soft_reboot_gpu_baremetal_cluster', 'soft_reboot_gpu_baremetal_server', + 'soft_reboot_gpu_virtual_cluster', 'soft_reboot_gpu_virtual_server', + 'soft_reboot_vm', 'start_bm', 'start_gpu_baremetal_cluster', + 'start_gpu_baremetal_server', 'start_gpu_virtual_cluster', + 'start_gpu_virtual_server', 'start_vm', 'stop_bm', 'stop_gpu_baremetal_cluster', + 'stop_gpu_baremetal_server', 'stop_gpu_virtual_cluster', + 'stop_gpu_virtual_server', 'stop_vm', 'suspend_vm', 'sync_private_flavors', + 'update_ddos_profile', 'update_floating_ip', 'update_inference_application', + 'update_inference_instance', 'update_k8s_cluster_v2', 'update_l7policy', + 'update_lbmetadata', 'update_loadbalancer', 'update_port_allowed_address_pairs', + 'update_router', 'update_security_group', 'update_sfs', + 'update_tags_gpu_virtual_cluster', 'upgrade_k8s_cluster_v2', + 'upscale_ai_cluster_gpu', 'upscale_gpu_virtual_cluster'] """ to_timestamp: Annotated[Union[str, datetime], PropertyInfo(format="iso8601")] From 97a4ce4ef4d90ac73499551681ddaab1530ada42 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:29:10 +0000 Subject: [PATCH 06/25] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index acd1f4e5..7bac7fda 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 650 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-47373f82df7a117f54d67450180eab62280ebda4a73470c98a2511ab776e51e2.yml -openapi_spec_hash: 5ac3f10ea6fc912220c3c193a3eebc75 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-1adc2594ef450a04ccec478489b94ac525a2f10470bfe5de476bf5f6e7581fdb.yml +openapi_spec_hash: 13d65f2efe9f2266d0d0299ea707cccc config_hash: 04626cc332f61b5896412323f83340f7 From 8cd4f0f354425ae82885dbd8342e1d6d6fc56736 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 23:15:13 +0000 Subject: [PATCH 07/25] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 7bac7fda..0f1bd4a8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 650 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-1adc2594ef450a04ccec478489b94ac525a2f10470bfe5de476bf5f6e7581fdb.yml -openapi_spec_hash: 13d65f2efe9f2266d0d0299ea707cccc +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-42598c3524698b689c362b33bb5d2d471281d853f53a8707a809f2c05dfb0144.yml +openapi_spec_hash: 283809f93516f67b7bb1328608d4341e config_hash: 04626cc332f61b5896412323f83340f7 From 1617eb374498f1b445a8466163d42c4b49ff4ca5 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 10:27:24 +0000 Subject: [PATCH 08/25] feat(api): aggregated API specs update --- .stats.yml | 4 ++-- src/gcore/resources/cloud/projects.py | 8 -------- src/gcore/types/cloud/project_list_params.py | 3 --- tests/api_resources/cloud/test_projects.py | 2 -- 4 files changed, 2 insertions(+), 15 deletions(-) diff --git a/.stats.yml b/.stats.yml index 0f1bd4a8..ac497f6f 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 650 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-42598c3524698b689c362b33bb5d2d471281d853f53a8707a809f2c05dfb0144.yml -openapi_spec_hash: 283809f93516f67b7bb1328608d4341e +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-f0661631158989a9f89e02c2dca049e2791dd212956b54749a89d382aaec9464.yml +openapi_spec_hash: bfaa58f8980edb933d25051107de9766 config_hash: 04626cc332f61b5896412323f83340f7 diff --git a/src/gcore/resources/cloud/projects.py b/src/gcore/resources/cloud/projects.py index 5e17bd1d..2ef02386 100644 --- a/src/gcore/resources/cloud/projects.py +++ b/src/gcore/resources/cloud/projects.py @@ -148,7 +148,6 @@ def update( def list( self, *, - client_id: int | Omit = omit, include_deleted: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, @@ -167,8 +166,6 @@ def list( ordered by various fields. Args: - client_id: Client ID filter for administrators. - include_deleted: Whether to include deleted projects in the response. limit: Limit value is used to limit the number of records in the result @@ -197,7 +194,6 @@ def list( timeout=timeout, query=maybe_transform( { - "client_id": client_id, "include_deleted": include_deleted, "limit": limit, "name": name, @@ -406,7 +402,6 @@ async def update( def list( self, *, - client_id: int | Omit = omit, include_deleted: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, @@ -425,8 +420,6 @@ def list( ordered by various fields. Args: - client_id: Client ID filter for administrators. - include_deleted: Whether to include deleted projects in the response. limit: Limit value is used to limit the number of records in the result @@ -455,7 +448,6 @@ def list( timeout=timeout, query=maybe_transform( { - "client_id": client_id, "include_deleted": include_deleted, "limit": limit, "name": name, diff --git a/src/gcore/types/cloud/project_list_params.py b/src/gcore/types/cloud/project_list_params.py index a469a6ed..837dd567 100644 --- a/src/gcore/types/cloud/project_list_params.py +++ b/src/gcore/types/cloud/project_list_params.py @@ -8,9 +8,6 @@ class ProjectListParams(TypedDict, total=False): - client_id: int - """Client ID filter for administrators.""" - include_deleted: bool """Whether to include deleted projects in the response.""" diff --git a/tests/api_resources/cloud/test_projects.py b/tests/api_resources/cloud/test_projects.py index 3a4da5cc..0f4687b4 100644 --- a/tests/api_resources/cloud/test_projects.py +++ b/tests/api_resources/cloud/test_projects.py @@ -105,7 +105,6 @@ def test_method_list(self, client: Gcore) -> None: @parametrize def test_method_list_with_all_params(self, client: Gcore) -> None: project = client.cloud.projects.list( - client_id=1, include_deleted=False, limit=100, name="my-project", @@ -289,7 +288,6 @@ async def test_method_list(self, async_client: AsyncGcore) -> None: @parametrize async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> None: project = await async_client.cloud.projects.list( - client_id=1, include_deleted=False, limit=100, name="my-project", From 32d2c7f57ea36b251be247eb9e33b198cf2ec310 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 11:19:55 +0000 Subject: [PATCH 09/25] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index ac497f6f..a8bd6d59 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 650 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-f0661631158989a9f89e02c2dca049e2791dd212956b54749a89d382aaec9464.yml openapi_spec_hash: bfaa58f8980edb933d25051107de9766 -config_hash: 04626cc332f61b5896412323f83340f7 +config_hash: 6a339ec3fd15c1e0537517fe15083f56 From dad416e2cacc75da3cbfc0c711e3ac21c5101c03 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:32:58 +0000 Subject: [PATCH 10/25] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index a8bd6d59..9a6888e0 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 650 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-f0661631158989a9f89e02c2dca049e2791dd212956b54749a89d382aaec9464.yml -openapi_spec_hash: bfaa58f8980edb933d25051107de9766 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-a38b54906e3ed36b12af9f9cb5b74f9b758b6fa871caafdc83c01348bf8cfe9d.yml +openapi_spec_hash: a495cd5cd8f837c5c51e802d6b0d0970 config_hash: 6a339ec3fd15c1e0537517fe15083f56 From 095771e81a76ad881f78d201564e3ad900230f51 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 08:39:41 +0000 Subject: [PATCH 11/25] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 9a6888e0..9bd60643 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 650 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-a38b54906e3ed36b12af9f9cb5b74f9b758b6fa871caafdc83c01348bf8cfe9d.yml openapi_spec_hash: a495cd5cd8f837c5c51e802d6b0d0970 -config_hash: 6a339ec3fd15c1e0537517fe15083f56 +config_hash: 755c5f3a90bfd6a7d9da604c6f88a667 From bae5faff732a79d6bba81563075b61f7f4d450dd Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 08:55:35 +0000 Subject: [PATCH 12/25] feat(cdn): enable terraform support for cdn_rule_template --- .stats.yml | 2 +- src/gcore/resources/cdn/cdn.py | 18 ++++++++++++++++++ src/gcore/resources/cdn/rule_templates.py | 8 ++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 9bd60643..e4f4535c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 650 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-a38b54906e3ed36b12af9f9cb5b74f9b758b6fa871caafdc83c01348bf8cfe9d.yml openapi_spec_hash: a495cd5cd8f837c5c51e802d6b0d0970 -config_hash: 755c5f3a90bfd6a7d9da604c6f88a667 +config_hash: d692cd12e359fe70081e97db517a8cfe diff --git a/src/gcore/resources/cdn/cdn.py b/src/gcore/resources/cdn/cdn.py index 1a41c290..7b80bde4 100644 --- a/src/gcore/resources/cdn/cdn.py +++ b/src/gcore/resources/cdn/cdn.py @@ -156,6 +156,9 @@ def origin_groups(self) -> OriginGroupsResource: @cached_property def rule_templates(self) -> RuleTemplatesResource: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return RuleTemplatesResource(self._client) @cached_property @@ -498,6 +501,9 @@ def origin_groups(self) -> AsyncOriginGroupsResource: @cached_property def rule_templates(self) -> AsyncRuleTemplatesResource: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return AsyncRuleTemplatesResource(self._client) @cached_property @@ -865,6 +871,9 @@ def origin_groups(self) -> OriginGroupsResourceWithRawResponse: @cached_property def rule_templates(self) -> RuleTemplatesResourceWithRawResponse: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return RuleTemplatesResourceWithRawResponse(self._cdn.rule_templates) @cached_property @@ -985,6 +994,9 @@ def origin_groups(self) -> AsyncOriginGroupsResourceWithRawResponse: @cached_property def rule_templates(self) -> AsyncRuleTemplatesResourceWithRawResponse: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return AsyncRuleTemplatesResourceWithRawResponse(self._cdn.rule_templates) @cached_property @@ -1105,6 +1117,9 @@ def origin_groups(self) -> OriginGroupsResourceWithStreamingResponse: @cached_property def rule_templates(self) -> RuleTemplatesResourceWithStreamingResponse: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return RuleTemplatesResourceWithStreamingResponse(self._cdn.rule_templates) @cached_property @@ -1225,6 +1240,9 @@ def origin_groups(self) -> AsyncOriginGroupsResourceWithStreamingResponse: @cached_property def rule_templates(self) -> AsyncRuleTemplatesResourceWithStreamingResponse: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return AsyncRuleTemplatesResourceWithStreamingResponse(self._cdn.rule_templates) @cached_property diff --git a/src/gcore/resources/cdn/rule_templates.py b/src/gcore/resources/cdn/rule_templates.py index 326b7811..fbbde279 100644 --- a/src/gcore/resources/cdn/rule_templates.py +++ b/src/gcore/resources/cdn/rule_templates.py @@ -26,6 +26,10 @@ class RuleTemplatesResource(SyncAPIResource): + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ + @cached_property def with_raw_response(self) -> RuleTemplatesResourceWithRawResponse: """ @@ -395,6 +399,10 @@ def replace( class AsyncRuleTemplatesResource(AsyncAPIResource): + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ + @cached_property def with_raw_response(self) -> AsyncRuleTemplatesResourceWithRawResponse: """ From 893f007fa4eb3323367748b55c21925e715de62a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:13:54 +0000 Subject: [PATCH 13/25] feat(api): Revert "feat(cdn): enable terraform support for cdn_rule_template" This reverts commit a8e5260d44fb236e85cd692a9372089adf602558. --- .stats.yml | 2 +- src/gcore/resources/cdn/cdn.py | 18 ------------------ src/gcore/resources/cdn/rule_templates.py | 8 -------- 3 files changed, 1 insertion(+), 27 deletions(-) diff --git a/.stats.yml b/.stats.yml index e4f4535c..9bd60643 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 650 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-a38b54906e3ed36b12af9f9cb5b74f9b758b6fa871caafdc83c01348bf8cfe9d.yml openapi_spec_hash: a495cd5cd8f837c5c51e802d6b0d0970 -config_hash: d692cd12e359fe70081e97db517a8cfe +config_hash: 755c5f3a90bfd6a7d9da604c6f88a667 diff --git a/src/gcore/resources/cdn/cdn.py b/src/gcore/resources/cdn/cdn.py index 7b80bde4..1a41c290 100644 --- a/src/gcore/resources/cdn/cdn.py +++ b/src/gcore/resources/cdn/cdn.py @@ -156,9 +156,6 @@ def origin_groups(self) -> OriginGroupsResource: @cached_property def rule_templates(self) -> RuleTemplatesResource: - """ - CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. - """ return RuleTemplatesResource(self._client) @cached_property @@ -501,9 +498,6 @@ def origin_groups(self) -> AsyncOriginGroupsResource: @cached_property def rule_templates(self) -> AsyncRuleTemplatesResource: - """ - CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. - """ return AsyncRuleTemplatesResource(self._client) @cached_property @@ -871,9 +865,6 @@ def origin_groups(self) -> OriginGroupsResourceWithRawResponse: @cached_property def rule_templates(self) -> RuleTemplatesResourceWithRawResponse: - """ - CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. - """ return RuleTemplatesResourceWithRawResponse(self._cdn.rule_templates) @cached_property @@ -994,9 +985,6 @@ def origin_groups(self) -> AsyncOriginGroupsResourceWithRawResponse: @cached_property def rule_templates(self) -> AsyncRuleTemplatesResourceWithRawResponse: - """ - CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. - """ return AsyncRuleTemplatesResourceWithRawResponse(self._cdn.rule_templates) @cached_property @@ -1117,9 +1105,6 @@ def origin_groups(self) -> OriginGroupsResourceWithStreamingResponse: @cached_property def rule_templates(self) -> RuleTemplatesResourceWithStreamingResponse: - """ - CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. - """ return RuleTemplatesResourceWithStreamingResponse(self._cdn.rule_templates) @cached_property @@ -1240,9 +1225,6 @@ def origin_groups(self) -> AsyncOriginGroupsResourceWithStreamingResponse: @cached_property def rule_templates(self) -> AsyncRuleTemplatesResourceWithStreamingResponse: - """ - CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. - """ return AsyncRuleTemplatesResourceWithStreamingResponse(self._cdn.rule_templates) @cached_property diff --git a/src/gcore/resources/cdn/rule_templates.py b/src/gcore/resources/cdn/rule_templates.py index fbbde279..326b7811 100644 --- a/src/gcore/resources/cdn/rule_templates.py +++ b/src/gcore/resources/cdn/rule_templates.py @@ -26,10 +26,6 @@ class RuleTemplatesResource(SyncAPIResource): - """ - CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. - """ - @cached_property def with_raw_response(self) -> RuleTemplatesResourceWithRawResponse: """ @@ -399,10 +395,6 @@ def replace( class AsyncRuleTemplatesResource(AsyncAPIResource): - """ - CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. - """ - @cached_property def with_raw_response(self) -> AsyncRuleTemplatesResourceWithRawResponse: """ From 43216323d5aa93acb990d6db686e785f730a9323 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 14:58:57 +0000 Subject: [PATCH 14/25] feat(waap)!: replace deprecated domain-scoped traffic/requests endpoints with account-scoped analytics --- .stats.yml | 4 +- src/gcore/resources/waap/__init__.py | 14 + src/gcore/resources/waap/analytics.py | 835 ++++++++++++++++++ src/gcore/resources/waap/api.md | 27 +- .../resources/waap/domains/statistics.py | 399 --------- src/gcore/resources/waap/waap.py | 32 + src/gcore/types/waap/__init__.py | 16 + .../analytics_get_event_statistics_params.py | 33 + .../waap/analytics_get_requests_params.py | 72 ++ .../analytics_get_traffic_filtered_params.py | 66 ++ ...analytics_get_traffic_filtered_response.py | 10 + ...ams.py => analytics_get_traffic_params.py} | 12 +- ...e.py => analytics_get_traffic_response.py} | 4 +- src/gcore/types/waap/domains/__init__.py | 7 - .../statistic_get_requests_series_params.py | 74 -- .../waap/waap_compact_traffic_metrics.py | 32 + .../{domains => }/waap_request_summary.py | 2 +- .../waap/waap_simple_event_statistics.py | 54 ++ .../{domains => }/waap_traffic_metrics.py | 2 +- .../waap/domains/test_statistics.py | 228 ----- tests/api_resources/waap/test_analytics.py | 428 +++++++++ 21 files changed, 1629 insertions(+), 722 deletions(-) create mode 100644 src/gcore/resources/waap/analytics.py create mode 100644 src/gcore/types/waap/analytics_get_event_statistics_params.py create mode 100644 src/gcore/types/waap/analytics_get_requests_params.py create mode 100644 src/gcore/types/waap/analytics_get_traffic_filtered_params.py create mode 100644 src/gcore/types/waap/analytics_get_traffic_filtered_response.py rename src/gcore/types/waap/{domains/statistic_get_traffic_series_params.py => analytics_get_traffic_params.py} (68%) rename src/gcore/types/waap/{domains/statistic_get_traffic_series_response.py => analytics_get_traffic_response.py} (63%) delete mode 100644 src/gcore/types/waap/domains/statistic_get_requests_series_params.py create mode 100644 src/gcore/types/waap/waap_compact_traffic_metrics.py rename src/gcore/types/waap/{domains => }/waap_request_summary.py (98%) create mode 100644 src/gcore/types/waap/waap_simple_event_statistics.py rename src/gcore/types/waap/{domains => }/waap_traffic_metrics.py (98%) create mode 100644 tests/api_resources/waap/test_analytics.py diff --git a/.stats.yml b/.stats.yml index 9bd60643..67c04817 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 650 +configured_endpoints: 652 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-a38b54906e3ed36b12af9f9cb5b74f9b758b6fa871caafdc83c01348bf8cfe9d.yml openapi_spec_hash: a495cd5cd8f837c5c51e802d6b0d0970 -config_hash: 755c5f3a90bfd6a7d9da604c6f88a667 +config_hash: f6f337c8c33376dd38969e7e3a8aecb0 diff --git a/src/gcore/resources/waap/__init__.py b/src/gcore/resources/waap/__init__.py index cb4dfc95..cf80ffcc 100644 --- a/src/gcore/resources/waap/__init__.py +++ b/src/gcore/resources/waap/__init__.py @@ -40,6 +40,14 @@ InsightsResourceWithStreamingResponse, AsyncInsightsResourceWithStreamingResponse, ) +from .analytics import ( + AnalyticsResource, + AsyncAnalyticsResource, + AnalyticsResourceWithRawResponse, + AsyncAnalyticsResourceWithRawResponse, + AnalyticsResourceWithStreamingResponse, + AsyncAnalyticsResourceWithStreamingResponse, +) from .statistics import ( StatisticsResource, AsyncStatisticsResource, @@ -80,6 +88,12 @@ "AsyncStatisticsResourceWithRawResponse", "StatisticsResourceWithStreamingResponse", "AsyncStatisticsResourceWithStreamingResponse", + "AnalyticsResource", + "AsyncAnalyticsResource", + "AnalyticsResourceWithRawResponse", + "AsyncAnalyticsResourceWithRawResponse", + "AnalyticsResourceWithStreamingResponse", + "AsyncAnalyticsResourceWithStreamingResponse", "DomainsResource", "AsyncDomainsResource", "DomainsResourceWithRawResponse", diff --git a/src/gcore/resources/waap/analytics.py b/src/gcore/resources/waap/analytics.py new file mode 100644 index 00000000..65f50a90 --- /dev/null +++ b/src/gcore/resources/waap/analytics.py @@ -0,0 +1,835 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Iterable, Optional +from typing_extensions import Literal + +import httpx + +from ..._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given +from ..._utils import maybe_transform, async_maybe_transform +from ..._compat import cached_property +from ..._resource import SyncAPIResource, AsyncAPIResource +from ..._response import ( + to_raw_response_wrapper, + to_streamed_response_wrapper, + async_to_raw_response_wrapper, + async_to_streamed_response_wrapper, +) +from ...pagination import SyncOffsetPage, AsyncOffsetPage +from ...types.waap import ( + analytics_get_traffic_params, + analytics_get_requests_params, + analytics_get_event_statistics_params, + analytics_get_traffic_filtered_params, +) +from ..._base_client import AsyncPaginator, make_request_options +from ...types.waap.waap_request_summary import WaapRequestSummary +from ...types.waap.waap_simple_event_statistics import WaapSimpleEventStatistics +from ...types.waap.analytics_get_traffic_response import AnalyticsGetTrafficResponse +from ...types.waap.analytics_get_traffic_filtered_response import AnalyticsGetTrafficFilteredResponse + +__all__ = ["AnalyticsResource", "AsyncAnalyticsResource"] + + +class AnalyticsResource(SyncAPIResource): + @cached_property + def with_raw_response(self) -> AnalyticsResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/G-Core/gcore-python#accessing-raw-response-data-eg-headers + """ + return AnalyticsResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AnalyticsResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/G-Core/gcore-python#with_streaming_response + """ + return AnalyticsResourceWithStreamingResponse(self) + + def get_event_statistics( + self, + dimension: Literal["country", "rule", "org", "ip", "useragent", "target"], + *, + start: str, + domains: Iterable[int] | Omit = omit, + end: Optional[str] | Omit = omit, + ips: SequenceNotStr[str] | Omit = omit, + security_rule_names: SequenceNotStr[str] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> WaapSimpleEventStatistics: + """Retrieves event statistics per given dimension of a request characteristics. + + A + WAAP _Event_ represents a request observed by the system. The report contains + the total, blocked, suppressed, and allowed event counts for top ten points in + the selected dimension. + + Args: + dimension: A request characteristics dimension + + start: Filter data items starting from a specified date in ISO 8601 format + + domains: List of domain IDs. Empty list means all domains belonging to the current + account. + + end: Filter data items up to a specified end date in ISO 8601 format. If not + provided, defaults to the current date and time. + + ips: Filter statistics by client IP addresses (max 10). + + security_rule_names: Filter data by name of a security rule matched the request. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not dimension: + raise ValueError(f"Expected a non-empty value for `dimension` but received {dimension!r}") + return self._get( + f"/waap/v1/analytics/stats/{dimension}", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "start": start, + "domains": domains, + "end": end, + "ips": ips, + "security_rule_names": security_rule_names, + }, + analytics_get_event_statistics_params.AnalyticsGetEventStatisticsParams, + ), + ), + cast_to=WaapSimpleEventStatistics, + ) + + def get_requests( + self, + *, + start: str, + countries: SequenceNotStr[str] | Omit = omit, + decision: List[Literal["blocked", "monitored", "allowed", "passed"]] | Omit = omit, + domains: Iterable[int] | Omit = omit, + end: Optional[str] | Omit = omit, + http_methods: List[Literal["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE"]] | Omit = omit, + ips: SequenceNotStr[str] | Omit = omit, + limit: int | Omit = omit, + offset: int | Omit = omit, + optional_action: List[Literal["captcha", "challenge"]] | Omit = omit, + ordering: str | Omit = omit, + path: Optional[str] | Omit = omit, + reference_ids: SequenceNotStr[str] | Omit = omit, + request_ids: SequenceNotStr[str] | Omit = omit, + security_rule_names: SequenceNotStr[str] | Omit = omit, + session_ids: SequenceNotStr[str] | Omit = omit, + status_codes: Iterable[int] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> SyncOffsetPage[WaapRequestSummary]: + """Retrieve request log data over account's domains. + + The log records every request + passing through WAAP towards the origin server. + + Args: + start: Filter data items starting from a specified date in ISO 8601 format + + countries: Filter data by a country code of the originating IP address in ISO 3166-1 + alpha-2 format. + + decision: Filter data by decision. + + domains: List of domain IDs. Empty list means all domains belonging to the current + account. + + end: Filter data items up to a specified end date in ISO 8601 format. If not + provided, defaults to the current date and time. + + http_methods: Filter by HTTP methods + + ips: Filter traffic data by client IP. + + limit: Number of items to return + + offset: Number of items to skip + + optional_action: Filter data by optional action. + + ordering: Sort data by given field. + + path: Filter by URL path with a glob-like pattern. + + reference_ids: Filter data by reference IDs. + + request_ids: Filter data by request IDs. + + security_rule_names: Filter data by name of a security rule matched the request. + + session_ids: Filter data by session IDs. + + status_codes: Filter data by HTTP response status code. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._get_api_list( + "/waap/v1/analytics/requests", + page=SyncOffsetPage[WaapRequestSummary], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "start": start, + "countries": countries, + "decision": decision, + "domains": domains, + "end": end, + "http_methods": http_methods, + "ips": ips, + "limit": limit, + "offset": offset, + "optional_action": optional_action, + "ordering": ordering, + "path": path, + "reference_ids": reference_ids, + "request_ids": request_ids, + "security_rule_names": security_rule_names, + "session_ids": session_ids, + "status_codes": status_codes, + }, + analytics_get_requests_params.AnalyticsGetRequestsParams, + ), + ), + model=WaapRequestSummary, + ) + + def get_traffic( + self, + *, + resolution: Literal["daily", "hourly", "minutely"], + start: str, + domains: Iterable[int] | Omit = omit, + end: Optional[str] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> AnalyticsGetTrafficResponse: + """Retrieves a comprehensive report on traffic statistics for a set of domains. + + The + report includes details such as API requests, blocked events, error counts, and + many more traffic-related metrics. + + Args: + resolution: Specifies the granularity of the result data. + + start: Filter data items starting from a specified date in ISO 8601 format + + domains: List of domain IDs. Empty list means all domains belonging to the current + account. + + end: Filter data items up to a specified end date in ISO 8601 format. If not + provided, defaults to the current date and time. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._get( + "/waap/v1/analytics/traffic", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "resolution": resolution, + "start": start, + "domains": domains, + "end": end, + }, + analytics_get_traffic_params.AnalyticsGetTrafficParams, + ), + ), + cast_to=AnalyticsGetTrafficResponse, + ) + + def get_traffic_filtered( + self, + *, + resolution: Literal["daily", "hourly", "minutely"], + start: str, + countries: SequenceNotStr[str] | Omit = omit, + decision: List[Literal["blocked", "monitored", "allowed", "passed"]] | Omit = omit, + domains: Iterable[int] | Omit = omit, + end: Optional[str] | Omit = omit, + http_methods: List[Literal["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE"]] | Omit = omit, + ips: SequenceNotStr[str] | Omit = omit, + optional_action: List[Literal["captcha", "challenge"]] | Omit = omit, + path: Optional[str] | Omit = omit, + reference_ids: SequenceNotStr[str] | Omit = omit, + request_ids: SequenceNotStr[str] | Omit = omit, + security_rule_names: SequenceNotStr[str] | Omit = omit, + session_ids: SequenceNotStr[str] | Omit = omit, + status_codes: Iterable[int] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> AnalyticsGetTrafficFilteredResponse: + """Retrieves a traffic time series data over a set of domains. + + The response is + suitable for plotting a time series chart. This method allows filtering the + traffic data by various criteria. + + Args: + resolution: Specifies the granularity of the result data. + + start: Filter data items starting from a specified date in ISO 8601 format + + countries: Filter data by a country code of the originating IP address in ISO 3166-1 + alpha-2 format. + + decision: Filter data by decision. + + domains: List of domain IDs. Empty list means all domains belonging to the current + account. + + end: Filter data items up to a specified end date in ISO 8601 format. If not + provided, defaults to the current date and time. + + http_methods: Filter by HTTP methods + + ips: Filter traffic data by client IP. + + optional_action: Filter data by optional action. + + path: Filter by URL path with a glob-like pattern. + + reference_ids: Filter data by reference IDs. + + request_ids: Filter data by request IDs. + + security_rule_names: Filter data by name of a security rule matched the request. + + session_ids: Filter data by session IDs. + + status_codes: Filter data by HTTP response status code. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._get( + "/waap/v1/analytics/traffic-filtered", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "resolution": resolution, + "start": start, + "countries": countries, + "decision": decision, + "domains": domains, + "end": end, + "http_methods": http_methods, + "ips": ips, + "optional_action": optional_action, + "path": path, + "reference_ids": reference_ids, + "request_ids": request_ids, + "security_rule_names": security_rule_names, + "session_ids": session_ids, + "status_codes": status_codes, + }, + analytics_get_traffic_filtered_params.AnalyticsGetTrafficFilteredParams, + ), + ), + cast_to=AnalyticsGetTrafficFilteredResponse, + ) + + +class AsyncAnalyticsResource(AsyncAPIResource): + @cached_property + def with_raw_response(self) -> AsyncAnalyticsResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/G-Core/gcore-python#accessing-raw-response-data-eg-headers + """ + return AsyncAnalyticsResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncAnalyticsResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/G-Core/gcore-python#with_streaming_response + """ + return AsyncAnalyticsResourceWithStreamingResponse(self) + + async def get_event_statistics( + self, + dimension: Literal["country", "rule", "org", "ip", "useragent", "target"], + *, + start: str, + domains: Iterable[int] | Omit = omit, + end: Optional[str] | Omit = omit, + ips: SequenceNotStr[str] | Omit = omit, + security_rule_names: SequenceNotStr[str] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> WaapSimpleEventStatistics: + """Retrieves event statistics per given dimension of a request characteristics. + + A + WAAP _Event_ represents a request observed by the system. The report contains + the total, blocked, suppressed, and allowed event counts for top ten points in + the selected dimension. + + Args: + dimension: A request characteristics dimension + + start: Filter data items starting from a specified date in ISO 8601 format + + domains: List of domain IDs. Empty list means all domains belonging to the current + account. + + end: Filter data items up to a specified end date in ISO 8601 format. If not + provided, defaults to the current date and time. + + ips: Filter statistics by client IP addresses (max 10). + + security_rule_names: Filter data by name of a security rule matched the request. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not dimension: + raise ValueError(f"Expected a non-empty value for `dimension` but received {dimension!r}") + return await self._get( + f"/waap/v1/analytics/stats/{dimension}", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform( + { + "start": start, + "domains": domains, + "end": end, + "ips": ips, + "security_rule_names": security_rule_names, + }, + analytics_get_event_statistics_params.AnalyticsGetEventStatisticsParams, + ), + ), + cast_to=WaapSimpleEventStatistics, + ) + + def get_requests( + self, + *, + start: str, + countries: SequenceNotStr[str] | Omit = omit, + decision: List[Literal["blocked", "monitored", "allowed", "passed"]] | Omit = omit, + domains: Iterable[int] | Omit = omit, + end: Optional[str] | Omit = omit, + http_methods: List[Literal["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE"]] | Omit = omit, + ips: SequenceNotStr[str] | Omit = omit, + limit: int | Omit = omit, + offset: int | Omit = omit, + optional_action: List[Literal["captcha", "challenge"]] | Omit = omit, + ordering: str | Omit = omit, + path: Optional[str] | Omit = omit, + reference_ids: SequenceNotStr[str] | Omit = omit, + request_ids: SequenceNotStr[str] | Omit = omit, + security_rule_names: SequenceNotStr[str] | Omit = omit, + session_ids: SequenceNotStr[str] | Omit = omit, + status_codes: Iterable[int] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> AsyncPaginator[WaapRequestSummary, AsyncOffsetPage[WaapRequestSummary]]: + """Retrieve request log data over account's domains. + + The log records every request + passing through WAAP towards the origin server. + + Args: + start: Filter data items starting from a specified date in ISO 8601 format + + countries: Filter data by a country code of the originating IP address in ISO 3166-1 + alpha-2 format. + + decision: Filter data by decision. + + domains: List of domain IDs. Empty list means all domains belonging to the current + account. + + end: Filter data items up to a specified end date in ISO 8601 format. If not + provided, defaults to the current date and time. + + http_methods: Filter by HTTP methods + + ips: Filter traffic data by client IP. + + limit: Number of items to return + + offset: Number of items to skip + + optional_action: Filter data by optional action. + + ordering: Sort data by given field. + + path: Filter by URL path with a glob-like pattern. + + reference_ids: Filter data by reference IDs. + + request_ids: Filter data by request IDs. + + security_rule_names: Filter data by name of a security rule matched the request. + + session_ids: Filter data by session IDs. + + status_codes: Filter data by HTTP response status code. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._get_api_list( + "/waap/v1/analytics/requests", + page=AsyncOffsetPage[WaapRequestSummary], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "start": start, + "countries": countries, + "decision": decision, + "domains": domains, + "end": end, + "http_methods": http_methods, + "ips": ips, + "limit": limit, + "offset": offset, + "optional_action": optional_action, + "ordering": ordering, + "path": path, + "reference_ids": reference_ids, + "request_ids": request_ids, + "security_rule_names": security_rule_names, + "session_ids": session_ids, + "status_codes": status_codes, + }, + analytics_get_requests_params.AnalyticsGetRequestsParams, + ), + ), + model=WaapRequestSummary, + ) + + async def get_traffic( + self, + *, + resolution: Literal["daily", "hourly", "minutely"], + start: str, + domains: Iterable[int] | Omit = omit, + end: Optional[str] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> AnalyticsGetTrafficResponse: + """Retrieves a comprehensive report on traffic statistics for a set of domains. + + The + report includes details such as API requests, blocked events, error counts, and + many more traffic-related metrics. + + Args: + resolution: Specifies the granularity of the result data. + + start: Filter data items starting from a specified date in ISO 8601 format + + domains: List of domain IDs. Empty list means all domains belonging to the current + account. + + end: Filter data items up to a specified end date in ISO 8601 format. If not + provided, defaults to the current date and time. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return await self._get( + "/waap/v1/analytics/traffic", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform( + { + "resolution": resolution, + "start": start, + "domains": domains, + "end": end, + }, + analytics_get_traffic_params.AnalyticsGetTrafficParams, + ), + ), + cast_to=AnalyticsGetTrafficResponse, + ) + + async def get_traffic_filtered( + self, + *, + resolution: Literal["daily", "hourly", "minutely"], + start: str, + countries: SequenceNotStr[str] | Omit = omit, + decision: List[Literal["blocked", "monitored", "allowed", "passed"]] | Omit = omit, + domains: Iterable[int] | Omit = omit, + end: Optional[str] | Omit = omit, + http_methods: List[Literal["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE"]] | Omit = omit, + ips: SequenceNotStr[str] | Omit = omit, + optional_action: List[Literal["captcha", "challenge"]] | Omit = omit, + path: Optional[str] | Omit = omit, + reference_ids: SequenceNotStr[str] | Omit = omit, + request_ids: SequenceNotStr[str] | Omit = omit, + security_rule_names: SequenceNotStr[str] | Omit = omit, + session_ids: SequenceNotStr[str] | Omit = omit, + status_codes: Iterable[int] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> AnalyticsGetTrafficFilteredResponse: + """Retrieves a traffic time series data over a set of domains. + + The response is + suitable for plotting a time series chart. This method allows filtering the + traffic data by various criteria. + + Args: + resolution: Specifies the granularity of the result data. + + start: Filter data items starting from a specified date in ISO 8601 format + + countries: Filter data by a country code of the originating IP address in ISO 3166-1 + alpha-2 format. + + decision: Filter data by decision. + + domains: List of domain IDs. Empty list means all domains belonging to the current + account. + + end: Filter data items up to a specified end date in ISO 8601 format. If not + provided, defaults to the current date and time. + + http_methods: Filter by HTTP methods + + ips: Filter traffic data by client IP. + + optional_action: Filter data by optional action. + + path: Filter by URL path with a glob-like pattern. + + reference_ids: Filter data by reference IDs. + + request_ids: Filter data by request IDs. + + security_rule_names: Filter data by name of a security rule matched the request. + + session_ids: Filter data by session IDs. + + status_codes: Filter data by HTTP response status code. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return await self._get( + "/waap/v1/analytics/traffic-filtered", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform( + { + "resolution": resolution, + "start": start, + "countries": countries, + "decision": decision, + "domains": domains, + "end": end, + "http_methods": http_methods, + "ips": ips, + "optional_action": optional_action, + "path": path, + "reference_ids": reference_ids, + "request_ids": request_ids, + "security_rule_names": security_rule_names, + "session_ids": session_ids, + "status_codes": status_codes, + }, + analytics_get_traffic_filtered_params.AnalyticsGetTrafficFilteredParams, + ), + ), + cast_to=AnalyticsGetTrafficFilteredResponse, + ) + + +class AnalyticsResourceWithRawResponse: + def __init__(self, analytics: AnalyticsResource) -> None: + self._analytics = analytics + + self.get_event_statistics = to_raw_response_wrapper( + analytics.get_event_statistics, + ) + self.get_requests = to_raw_response_wrapper( + analytics.get_requests, + ) + self.get_traffic = to_raw_response_wrapper( + analytics.get_traffic, + ) + self.get_traffic_filtered = to_raw_response_wrapper( + analytics.get_traffic_filtered, + ) + + +class AsyncAnalyticsResourceWithRawResponse: + def __init__(self, analytics: AsyncAnalyticsResource) -> None: + self._analytics = analytics + + self.get_event_statistics = async_to_raw_response_wrapper( + analytics.get_event_statistics, + ) + self.get_requests = async_to_raw_response_wrapper( + analytics.get_requests, + ) + self.get_traffic = async_to_raw_response_wrapper( + analytics.get_traffic, + ) + self.get_traffic_filtered = async_to_raw_response_wrapper( + analytics.get_traffic_filtered, + ) + + +class AnalyticsResourceWithStreamingResponse: + def __init__(self, analytics: AnalyticsResource) -> None: + self._analytics = analytics + + self.get_event_statistics = to_streamed_response_wrapper( + analytics.get_event_statistics, + ) + self.get_requests = to_streamed_response_wrapper( + analytics.get_requests, + ) + self.get_traffic = to_streamed_response_wrapper( + analytics.get_traffic, + ) + self.get_traffic_filtered = to_streamed_response_wrapper( + analytics.get_traffic_filtered, + ) + + +class AsyncAnalyticsResourceWithStreamingResponse: + def __init__(self, analytics: AsyncAnalyticsResource) -> None: + self._analytics = analytics + + self.get_event_statistics = async_to_streamed_response_wrapper( + analytics.get_event_statistics, + ) + self.get_requests = async_to_streamed_response_wrapper( + analytics.get_requests, + ) + self.get_traffic = async_to_streamed_response_wrapper( + analytics.get_traffic, + ) + self.get_traffic_filtered = async_to_streamed_response_wrapper( + analytics.get_traffic_filtered, + ) diff --git a/src/gcore/resources/waap/api.md b/src/gcore/resources/waap/api.md index 883cd8b2..1fd98280 100644 --- a/src/gcore/resources/waap/api.md +++ b/src/gcore/resources/waap/api.md @@ -22,6 +22,26 @@ Methods: - client.waap.statistics.get_usage_series(\*\*params) -> WaapStatisticsSeries +## Analytics + +Types: + +```python +from gcore.types.waap import ( + WaapCompactTrafficMetrics, + WaapSimpleEventStatistics, + AnalyticsGetTrafficResponse, + AnalyticsGetTrafficFilteredResponse, +) +``` + +Methods: + +- client.waap.analytics.get_event_statistics(dimension, \*\*params) -> WaapSimpleEventStatistics +- client.waap.analytics.get_requests(\*\*params) -> SyncOffsetPage[WaapRequestSummary] +- client.waap.analytics.get_traffic(\*\*params) -> AnalyticsGetTrafficResponse +- client.waap.analytics.get_traffic_filtered(\*\*params) -> AnalyticsGetTrafficFilteredResponse + ## Domains Types: @@ -32,8 +52,10 @@ from gcore.types.waap import ( WaapDomainAPISettings, WaapDomainDDOSSettings, WaapDomainSettingsModel, + WaapRequestSummary, WaapRuleSet, WaapSummaryDomain, + WaapTrafficMetrics, DomainListRuleSetsResponse, ) ``` @@ -176,9 +198,6 @@ from gcore.types.waap.domains import ( WaapDDOSInfo, WaapEventStatistics, WaapRequestDetails, - WaapRequestSummary, - WaapTrafficMetrics, - StatisticGetTrafficSeriesResponse, ) ``` @@ -188,8 +207,6 @@ Methods: - client.waap.domains.statistics.get_ddos_info(domain_id, \*\*params) -> SyncOffsetPage[WaapDDOSInfo] - client.waap.domains.statistics.get_events_aggregated(domain_id, \*\*params) -> WaapEventStatistics - client.waap.domains.statistics.get_request_details(request_id, \*, domain_id) -> WaapRequestDetails -- client.waap.domains.statistics.get_requests_series(domain_id, \*\*params) -> SyncOffsetPage[WaapRequestSummary] -- client.waap.domains.statistics.get_traffic_series(domain_id, \*\*params) -> StatisticGetTrafficSeriesResponse ### CustomRules diff --git a/src/gcore/resources/waap/domains/statistics.py b/src/gcore/resources/waap/domains/statistics.py index e990b52d..906d2a57 100644 --- a/src/gcore/resources/waap/domains/statistics.py +++ b/src/gcore/resources/waap/domains/statistics.py @@ -2,7 +2,6 @@ from __future__ import annotations -import typing_extensions from typing import List, Union, Optional from datetime import datetime from typing_extensions import Literal @@ -24,16 +23,12 @@ from ....types.waap.domains import ( statistic_get_ddos_info_params, statistic_get_ddos_attacks_params, - statistic_get_traffic_series_params, - statistic_get_requests_series_params, statistic_get_events_aggregated_params, ) from ....types.waap.domains.waap_ddos_info import WaapDDOSInfo from ....types.waap.domains.waap_ddos_attack import WaapDDOSAttack from ....types.waap.domains.waap_request_details import WaapRequestDetails -from ....types.waap.domains.waap_request_summary import WaapRequestSummary from ....types.waap.domains.waap_event_statistics import WaapEventStatistics -from ....types.waap.domains.statistic_get_traffic_series_response import StatisticGetTrafficSeriesResponse __all__ = ["StatisticsResource", "AsyncStatisticsResource"] @@ -288,183 +283,6 @@ def get_request_details( cast_to=WaapRequestDetails, ) - @typing_extensions.deprecated("deprecated") - def get_requests_series( - self, - domain_id: int, - *, - start: str, - actions: List[Literal["allow", "block", "captcha", "handshake"]] | Omit = omit, - countries: SequenceNotStr[str] | Omit = omit, - end: Optional[str] | Omit = omit, - ip: str | Omit = omit, - limit: int | Omit = omit, - offset: int | Omit = omit, - ordering: str | Omit = omit, - reference_id: str | Omit = omit, - security_rule_name: str | Omit = omit, - status_code: int | Omit = omit, - traffic_types: List[ - Literal[ - "policy_allowed", - "policy_blocked", - "custom_rule_allowed", - "custom_blocked", - "legit_requests", - "sanctioned", - "dynamic", - "api", - "static", - "ajax", - "redirects", - "monitor", - "err_40x", - "err_50x", - "passed_to_origin", - "timeout", - "other", - "ddos", - "legit", - "monitored", - ] - ] - | Omit = omit, - # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. - # The extra values given here take precedence over values defined on the client or passed to this method. - extra_headers: Headers | None = None, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> SyncOffsetPage[WaapRequestSummary]: - """Retrieve a domain's requests data. - - Deprecated. Use - [GET /v1/analytics/requests](/docs/api-reference/waap/analytics/get-request-log-data) - instead. - - Args: - domain_id: The domain ID - - start: Filter data items starting from a specified date in ISO 8601 format - - actions: Filter the response by actions. - - countries: Filter the response by country codes in ISO 3166-1 alpha-2 format. - - end: Filter data items up to a specified end date in ISO 8601 format. If not - provided, defaults to the current date and time. - - ip: Filter the response by IP. - - limit: Number of items to return - - offset: Number of items to skip - - ordering: Sort the response by given field. - - reference_id: Filter the response by reference ID. - - security_rule_name: Filter the response by security rule name. - - status_code: Filter the response by response code. - - traffic_types: Filter the response by traffic types. - - extra_headers: Send extra headers - - extra_query: Add additional query parameters to the request - - extra_body: Add additional JSON properties to the request - - timeout: Override the client-level default timeout for this request, in seconds - """ - return self._get_api_list( - f"/waap/v1/domains/{domain_id}/requests", - page=SyncOffsetPage[WaapRequestSummary], - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - query=maybe_transform( - { - "start": start, - "actions": actions, - "countries": countries, - "end": end, - "ip": ip, - "limit": limit, - "offset": offset, - "ordering": ordering, - "reference_id": reference_id, - "security_rule_name": security_rule_name, - "status_code": status_code, - "traffic_types": traffic_types, - }, - statistic_get_requests_series_params.StatisticGetRequestsSeriesParams, - ), - ), - model=WaapRequestSummary, - ) - - @typing_extensions.deprecated("deprecated") - def get_traffic_series( - self, - domain_id: int, - *, - resolution: Literal["daily", "hourly", "minutely"], - start: str, - end: Optional[str] | Omit = omit, - # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. - # The extra values given here take precedence over values defined on the client or passed to this method. - extra_headers: Headers | None = None, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> StatisticGetTrafficSeriesResponse: - """Deprecated. - - Use - [GET /v1/analytics/traffic](/docs/api-reference/waap/analytics/get-traffic-data) - instead. - - Args: - domain_id: The domain ID - - resolution: Specifies the granularity of the result data. - - start: Filter data items starting from a specified date in ISO 8601 format - - end: Filter data items up to a specified end date in ISO 8601 format. If not - provided, defaults to the current date and time. - - extra_headers: Send extra headers - - extra_query: Add additional query parameters to the request - - extra_body: Add additional JSON properties to the request - - timeout: Override the client-level default timeout for this request, in seconds - """ - return self._get( - f"/waap/v1/domains/{domain_id}/traffic", - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - query=maybe_transform( - { - "resolution": resolution, - "start": start, - "end": end, - }, - statistic_get_traffic_series_params.StatisticGetTrafficSeriesParams, - ), - ), - cast_to=StatisticGetTrafficSeriesResponse, - ) - class AsyncStatisticsResource(AsyncAPIResource): @cached_property @@ -716,183 +534,6 @@ async def get_request_details( cast_to=WaapRequestDetails, ) - @typing_extensions.deprecated("deprecated") - def get_requests_series( - self, - domain_id: int, - *, - start: str, - actions: List[Literal["allow", "block", "captcha", "handshake"]] | Omit = omit, - countries: SequenceNotStr[str] | Omit = omit, - end: Optional[str] | Omit = omit, - ip: str | Omit = omit, - limit: int | Omit = omit, - offset: int | Omit = omit, - ordering: str | Omit = omit, - reference_id: str | Omit = omit, - security_rule_name: str | Omit = omit, - status_code: int | Omit = omit, - traffic_types: List[ - Literal[ - "policy_allowed", - "policy_blocked", - "custom_rule_allowed", - "custom_blocked", - "legit_requests", - "sanctioned", - "dynamic", - "api", - "static", - "ajax", - "redirects", - "monitor", - "err_40x", - "err_50x", - "passed_to_origin", - "timeout", - "other", - "ddos", - "legit", - "monitored", - ] - ] - | Omit = omit, - # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. - # The extra values given here take precedence over values defined on the client or passed to this method. - extra_headers: Headers | None = None, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncPaginator[WaapRequestSummary, AsyncOffsetPage[WaapRequestSummary]]: - """Retrieve a domain's requests data. - - Deprecated. Use - [GET /v1/analytics/requests](/docs/api-reference/waap/analytics/get-request-log-data) - instead. - - Args: - domain_id: The domain ID - - start: Filter data items starting from a specified date in ISO 8601 format - - actions: Filter the response by actions. - - countries: Filter the response by country codes in ISO 3166-1 alpha-2 format. - - end: Filter data items up to a specified end date in ISO 8601 format. If not - provided, defaults to the current date and time. - - ip: Filter the response by IP. - - limit: Number of items to return - - offset: Number of items to skip - - ordering: Sort the response by given field. - - reference_id: Filter the response by reference ID. - - security_rule_name: Filter the response by security rule name. - - status_code: Filter the response by response code. - - traffic_types: Filter the response by traffic types. - - extra_headers: Send extra headers - - extra_query: Add additional query parameters to the request - - extra_body: Add additional JSON properties to the request - - timeout: Override the client-level default timeout for this request, in seconds - """ - return self._get_api_list( - f"/waap/v1/domains/{domain_id}/requests", - page=AsyncOffsetPage[WaapRequestSummary], - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - query=maybe_transform( - { - "start": start, - "actions": actions, - "countries": countries, - "end": end, - "ip": ip, - "limit": limit, - "offset": offset, - "ordering": ordering, - "reference_id": reference_id, - "security_rule_name": security_rule_name, - "status_code": status_code, - "traffic_types": traffic_types, - }, - statistic_get_requests_series_params.StatisticGetRequestsSeriesParams, - ), - ), - model=WaapRequestSummary, - ) - - @typing_extensions.deprecated("deprecated") - async def get_traffic_series( - self, - domain_id: int, - *, - resolution: Literal["daily", "hourly", "minutely"], - start: str, - end: Optional[str] | Omit = omit, - # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. - # The extra values given here take precedence over values defined on the client or passed to this method. - extra_headers: Headers | None = None, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> StatisticGetTrafficSeriesResponse: - """Deprecated. - - Use - [GET /v1/analytics/traffic](/docs/api-reference/waap/analytics/get-traffic-data) - instead. - - Args: - domain_id: The domain ID - - resolution: Specifies the granularity of the result data. - - start: Filter data items starting from a specified date in ISO 8601 format - - end: Filter data items up to a specified end date in ISO 8601 format. If not - provided, defaults to the current date and time. - - extra_headers: Send extra headers - - extra_query: Add additional query parameters to the request - - extra_body: Add additional JSON properties to the request - - timeout: Override the client-level default timeout for this request, in seconds - """ - return await self._get( - f"/waap/v1/domains/{domain_id}/traffic", - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - query=await async_maybe_transform( - { - "resolution": resolution, - "start": start, - "end": end, - }, - statistic_get_traffic_series_params.StatisticGetTrafficSeriesParams, - ), - ), - cast_to=StatisticGetTrafficSeriesResponse, - ) - class StatisticsResourceWithRawResponse: def __init__(self, statistics: StatisticsResource) -> None: @@ -910,16 +551,6 @@ def __init__(self, statistics: StatisticsResource) -> None: self.get_request_details = to_raw_response_wrapper( statistics.get_request_details, ) - self.get_requests_series = ( # pyright: ignore[reportDeprecated] - to_raw_response_wrapper( - statistics.get_requests_series, # pyright: ignore[reportDeprecated], - ) - ) - self.get_traffic_series = ( # pyright: ignore[reportDeprecated] - to_raw_response_wrapper( - statistics.get_traffic_series, # pyright: ignore[reportDeprecated], - ) - ) class AsyncStatisticsResourceWithRawResponse: @@ -938,16 +569,6 @@ def __init__(self, statistics: AsyncStatisticsResource) -> None: self.get_request_details = async_to_raw_response_wrapper( statistics.get_request_details, ) - self.get_requests_series = ( # pyright: ignore[reportDeprecated] - async_to_raw_response_wrapper( - statistics.get_requests_series, # pyright: ignore[reportDeprecated], - ) - ) - self.get_traffic_series = ( # pyright: ignore[reportDeprecated] - async_to_raw_response_wrapper( - statistics.get_traffic_series, # pyright: ignore[reportDeprecated], - ) - ) class StatisticsResourceWithStreamingResponse: @@ -966,16 +587,6 @@ def __init__(self, statistics: StatisticsResource) -> None: self.get_request_details = to_streamed_response_wrapper( statistics.get_request_details, ) - self.get_requests_series = ( # pyright: ignore[reportDeprecated] - to_streamed_response_wrapper( - statistics.get_requests_series, # pyright: ignore[reportDeprecated], - ) - ) - self.get_traffic_series = ( # pyright: ignore[reportDeprecated] - to_streamed_response_wrapper( - statistics.get_traffic_series, # pyright: ignore[reportDeprecated], - ) - ) class AsyncStatisticsResourceWithStreamingResponse: @@ -994,13 +605,3 @@ def __init__(self, statistics: AsyncStatisticsResource) -> None: self.get_request_details = async_to_streamed_response_wrapper( statistics.get_request_details, ) - self.get_requests_series = ( # pyright: ignore[reportDeprecated] - async_to_streamed_response_wrapper( - statistics.get_requests_series, # pyright: ignore[reportDeprecated], - ) - ) - self.get_traffic_series = ( # pyright: ignore[reportDeprecated] - async_to_streamed_response_wrapper( - statistics.get_traffic_series, # pyright: ignore[reportDeprecated], - ) - ) diff --git a/src/gcore/resources/waap/waap.py b/src/gcore/resources/waap/waap.py index 1603bb09..a03f8813 100644 --- a/src/gcore/resources/waap/waap.py +++ b/src/gcore/resources/waap/waap.py @@ -22,6 +22,14 @@ AsyncInsightsResourceWithStreamingResponse, ) from ..._compat import cached_property +from .analytics import ( + AnalyticsResource, + AsyncAnalyticsResource, + AnalyticsResourceWithRawResponse, + AsyncAnalyticsResourceWithRawResponse, + AnalyticsResourceWithStreamingResponse, + AsyncAnalyticsResourceWithStreamingResponse, +) from .statistics import ( StatisticsResource, AsyncStatisticsResource, @@ -88,6 +96,10 @@ class WaapResource(SyncAPIResource): def statistics(self) -> StatisticsResource: return StatisticsResource(self._client) + @cached_property + def analytics(self) -> AnalyticsResource: + return AnalyticsResource(self._client) + @cached_property def domains(self) -> DomainsResource: """ @@ -163,6 +175,10 @@ class AsyncWaapResource(AsyncAPIResource): def statistics(self) -> AsyncStatisticsResource: return AsyncStatisticsResource(self._client) + @cached_property + def analytics(self) -> AsyncAnalyticsResource: + return AsyncAnalyticsResource(self._client) + @cached_property def domains(self) -> AsyncDomainsResource: """ @@ -245,6 +261,10 @@ def __init__(self, waap: WaapResource) -> None: def statistics(self) -> StatisticsResourceWithRawResponse: return StatisticsResourceWithRawResponse(self._waap.statistics) + @cached_property + def analytics(self) -> AnalyticsResourceWithRawResponse: + return AnalyticsResourceWithRawResponse(self._waap.analytics) + @cached_property def domains(self) -> DomainsResourceWithRawResponse: """ @@ -289,6 +309,10 @@ def __init__(self, waap: AsyncWaapResource) -> None: def statistics(self) -> AsyncStatisticsResourceWithRawResponse: return AsyncStatisticsResourceWithRawResponse(self._waap.statistics) + @cached_property + def analytics(self) -> AsyncAnalyticsResourceWithRawResponse: + return AsyncAnalyticsResourceWithRawResponse(self._waap.analytics) + @cached_property def domains(self) -> AsyncDomainsResourceWithRawResponse: """ @@ -333,6 +357,10 @@ def __init__(self, waap: WaapResource) -> None: def statistics(self) -> StatisticsResourceWithStreamingResponse: return StatisticsResourceWithStreamingResponse(self._waap.statistics) + @cached_property + def analytics(self) -> AnalyticsResourceWithStreamingResponse: + return AnalyticsResourceWithStreamingResponse(self._waap.analytics) + @cached_property def domains(self) -> DomainsResourceWithStreamingResponse: """ @@ -377,6 +405,10 @@ def __init__(self, waap: AsyncWaapResource) -> None: def statistics(self) -> AsyncStatisticsResourceWithStreamingResponse: return AsyncStatisticsResourceWithStreamingResponse(self._waap.statistics) + @cached_property + def analytics(self) -> AsyncAnalyticsResourceWithStreamingResponse: + return AsyncAnalyticsResourceWithStreamingResponse(self._waap.analytics) + @cached_property def domains(self) -> AsyncDomainsResourceWithStreamingResponse: """ diff --git a/src/gcore/types/waap/__init__.py b/src/gcore/types/waap/__init__.py index 09c8023e..3fde8ef4 100644 --- a/src/gcore/types/waap/__init__.py +++ b/src/gcore/types/waap/__init__.py @@ -17,6 +17,8 @@ from .domain_update_params import DomainUpdateParams as DomainUpdateParams from .waap_custom_page_set import WaapCustomPageSet as WaapCustomPageSet from .waap_detailed_domain import WaapDetailedDomain as WaapDetailedDomain +from .waap_request_summary import WaapRequestSummary as WaapRequestSummary +from .waap_traffic_metrics import WaapTrafficMetrics as WaapTrafficMetrics from .waap_ip_country_attack import WaapIPCountryAttack as WaapIPCountryAttack from .waap_statistics_series import WaapStatisticsSeries as WaapStatisticsSeries from .waap_ip_ddos_info_model import WaapIPDDOSInfoModel as WaapIPDDOSInfoModel @@ -31,10 +33,15 @@ from .waap_rule_blocked_requests import WaapRuleBlockedRequests as WaapRuleBlockedRequests from .custom_page_set_list_params import CustomPageSetListParams as CustomPageSetListParams from .ip_info_get_top_urls_params import IPInfoGetTopURLsParams as IPInfoGetTopURLsParams +from .analytics_get_traffic_params import AnalyticsGetTrafficParams as AnalyticsGetTrafficParams +from .waap_compact_traffic_metrics import WaapCompactTrafficMetrics as WaapCompactTrafficMetrics +from .waap_simple_event_statistics import WaapSimpleEventStatistics as WaapSimpleEventStatistics +from .analytics_get_requests_params import AnalyticsGetRequestsParams as AnalyticsGetRequestsParams from .custom_page_set_create_params import CustomPageSetCreateParams as CustomPageSetCreateParams from .custom_page_set_update_params import CustomPageSetUpdateParams as CustomPageSetUpdateParams from .ip_info_get_top_urls_response import IPInfoGetTopURLsResponse as IPInfoGetTopURLsResponse from .waap_advanced_rule_descriptor import WaapAdvancedRuleDescriptor as WaapAdvancedRuleDescriptor +from .analytics_get_traffic_response import AnalyticsGetTrafficResponse as AnalyticsGetTrafficResponse from .custom_page_set_preview_params import CustomPageSetPreviewParams as CustomPageSetPreviewParams from .domain_list_rule_sets_response import DomainListRuleSetsResponse as DomainListRuleSetsResponse from .statistic_get_usage_series_params import StatisticGetUsageSeriesParams as StatisticGetUsageSeriesParams @@ -44,6 +51,12 @@ from .ip_info_get_blocked_requests_params import IPInfoGetBlockedRequestsParams as IPInfoGetBlockedRequestsParams from .ip_info_get_top_user_agents_response import IPInfoGetTopUserAgentsResponse as IPInfoGetTopUserAgentsResponse from .ip_info_get_top_user_sessions_params import IPInfoGetTopUserSessionsParams as IPInfoGetTopUserSessionsParams +from .analytics_get_event_statistics_params import ( + AnalyticsGetEventStatisticsParams as AnalyticsGetEventStatisticsParams, +) +from .analytics_get_traffic_filtered_params import ( + AnalyticsGetTrafficFilteredParams as AnalyticsGetTrafficFilteredParams, +) from .ip_info_get_attack_time_series_params import IPInfoGetAttackTimeSeriesParams as IPInfoGetAttackTimeSeriesParams from .ip_info_get_blocked_requests_response import IPInfoGetBlockedRequestsResponse as IPInfoGetBlockedRequestsResponse from .ip_info_get_ddos_attack_series_params import IPInfoGetDDOSAttackSeriesParams as IPInfoGetDDOSAttackSeriesParams @@ -51,6 +64,9 @@ from .ip_info_list_attacked_countries_params import ( IPInfoListAttackedCountriesParams as IPInfoListAttackedCountriesParams, ) +from .analytics_get_traffic_filtered_response import ( + AnalyticsGetTrafficFilteredResponse as AnalyticsGetTrafficFilteredResponse, +) from .ip_info_get_attack_time_series_response import ( IPInfoGetAttackTimeSeriesResponse as IPInfoGetAttackTimeSeriesResponse, ) diff --git a/src/gcore/types/waap/analytics_get_event_statistics_params.py b/src/gcore/types/waap/analytics_get_event_statistics_params.py new file mode 100644 index 00000000..ffd5f737 --- /dev/null +++ b/src/gcore/types/waap/analytics_get_event_statistics_params.py @@ -0,0 +1,33 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Iterable, Optional +from typing_extensions import Required, TypedDict + +from ..._types import SequenceNotStr + +__all__ = ["AnalyticsGetEventStatisticsParams"] + + +class AnalyticsGetEventStatisticsParams(TypedDict, total=False): + start: Required[str] + """Filter data items starting from a specified date in ISO 8601 format""" + + domains: Iterable[int] + """List of domain IDs. + + Empty list means all domains belonging to the current account. + """ + + end: Optional[str] + """Filter data items up to a specified end date in ISO 8601 format. + + If not provided, defaults to the current date and time. + """ + + ips: SequenceNotStr[str] + """Filter statistics by client IP addresses (max 10).""" + + security_rule_names: SequenceNotStr[str] + """Filter data by name of a security rule matched the request.""" diff --git a/src/gcore/types/waap/analytics_get_requests_params.py b/src/gcore/types/waap/analytics_get_requests_params.py new file mode 100644 index 00000000..6dbb7d92 --- /dev/null +++ b/src/gcore/types/waap/analytics_get_requests_params.py @@ -0,0 +1,72 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Iterable, Optional +from typing_extensions import Literal, Required, TypedDict + +from ..._types import SequenceNotStr + +__all__ = ["AnalyticsGetRequestsParams"] + + +class AnalyticsGetRequestsParams(TypedDict, total=False): + start: Required[str] + """Filter data items starting from a specified date in ISO 8601 format""" + + countries: SequenceNotStr[str] + """ + Filter data by a country code of the originating IP address in ISO 3166-1 + alpha-2 format. + """ + + decision: List[Literal["blocked", "monitored", "allowed", "passed"]] + """Filter data by decision.""" + + domains: Iterable[int] + """List of domain IDs. + + Empty list means all domains belonging to the current account. + """ + + end: Optional[str] + """Filter data items up to a specified end date in ISO 8601 format. + + If not provided, defaults to the current date and time. + """ + + http_methods: List[Literal["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE"]] + """Filter by HTTP methods""" + + ips: SequenceNotStr[str] + """Filter traffic data by client IP.""" + + limit: int + """Number of items to return""" + + offset: int + """Number of items to skip""" + + optional_action: List[Literal["captcha", "challenge"]] + """Filter data by optional action.""" + + ordering: str + """Sort data by given field.""" + + path: Optional[str] + """Filter by URL path with a glob-like pattern.""" + + reference_ids: SequenceNotStr[str] + """Filter data by reference IDs.""" + + request_ids: SequenceNotStr[str] + """Filter data by request IDs.""" + + security_rule_names: SequenceNotStr[str] + """Filter data by name of a security rule matched the request.""" + + session_ids: SequenceNotStr[str] + """Filter data by session IDs.""" + + status_codes: Iterable[int] + """Filter data by HTTP response status code.""" diff --git a/src/gcore/types/waap/analytics_get_traffic_filtered_params.py b/src/gcore/types/waap/analytics_get_traffic_filtered_params.py new file mode 100644 index 00000000..03295f07 --- /dev/null +++ b/src/gcore/types/waap/analytics_get_traffic_filtered_params.py @@ -0,0 +1,66 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Iterable, Optional +from typing_extensions import Literal, Required, TypedDict + +from ..._types import SequenceNotStr + +__all__ = ["AnalyticsGetTrafficFilteredParams"] + + +class AnalyticsGetTrafficFilteredParams(TypedDict, total=False): + resolution: Required[Literal["daily", "hourly", "minutely"]] + """Specifies the granularity of the result data.""" + + start: Required[str] + """Filter data items starting from a specified date in ISO 8601 format""" + + countries: SequenceNotStr[str] + """ + Filter data by a country code of the originating IP address in ISO 3166-1 + alpha-2 format. + """ + + decision: List[Literal["blocked", "monitored", "allowed", "passed"]] + """Filter data by decision.""" + + domains: Iterable[int] + """List of domain IDs. + + Empty list means all domains belonging to the current account. + """ + + end: Optional[str] + """Filter data items up to a specified end date in ISO 8601 format. + + If not provided, defaults to the current date and time. + """ + + http_methods: List[Literal["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE"]] + """Filter by HTTP methods""" + + ips: SequenceNotStr[str] + """Filter traffic data by client IP.""" + + optional_action: List[Literal["captcha", "challenge"]] + """Filter data by optional action.""" + + path: Optional[str] + """Filter by URL path with a glob-like pattern.""" + + reference_ids: SequenceNotStr[str] + """Filter data by reference IDs.""" + + request_ids: SequenceNotStr[str] + """Filter data by request IDs.""" + + security_rule_names: SequenceNotStr[str] + """Filter data by name of a security rule matched the request.""" + + session_ids: SequenceNotStr[str] + """Filter data by session IDs.""" + + status_codes: Iterable[int] + """Filter data by HTTP response status code.""" diff --git a/src/gcore/types/waap/analytics_get_traffic_filtered_response.py b/src/gcore/types/waap/analytics_get_traffic_filtered_response.py new file mode 100644 index 00000000..2a650136 --- /dev/null +++ b/src/gcore/types/waap/analytics_get_traffic_filtered_response.py @@ -0,0 +1,10 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List +from typing_extensions import TypeAlias + +from .waap_compact_traffic_metrics import WaapCompactTrafficMetrics + +__all__ = ["AnalyticsGetTrafficFilteredResponse"] + +AnalyticsGetTrafficFilteredResponse: TypeAlias = List[WaapCompactTrafficMetrics] diff --git a/src/gcore/types/waap/domains/statistic_get_traffic_series_params.py b/src/gcore/types/waap/analytics_get_traffic_params.py similarity index 68% rename from src/gcore/types/waap/domains/statistic_get_traffic_series_params.py rename to src/gcore/types/waap/analytics_get_traffic_params.py index 18b815fb..41c6d623 100644 --- a/src/gcore/types/waap/domains/statistic_get_traffic_series_params.py +++ b/src/gcore/types/waap/analytics_get_traffic_params.py @@ -2,19 +2,25 @@ from __future__ import annotations -from typing import Optional +from typing import Iterable, Optional from typing_extensions import Literal, Required, TypedDict -__all__ = ["StatisticGetTrafficSeriesParams"] +__all__ = ["AnalyticsGetTrafficParams"] -class StatisticGetTrafficSeriesParams(TypedDict, total=False): +class AnalyticsGetTrafficParams(TypedDict, total=False): resolution: Required[Literal["daily", "hourly", "minutely"]] """Specifies the granularity of the result data.""" start: Required[str] """Filter data items starting from a specified date in ISO 8601 format""" + domains: Iterable[int] + """List of domain IDs. + + Empty list means all domains belonging to the current account. + """ + end: Optional[str] """Filter data items up to a specified end date in ISO 8601 format. diff --git a/src/gcore/types/waap/domains/statistic_get_traffic_series_response.py b/src/gcore/types/waap/analytics_get_traffic_response.py similarity index 63% rename from src/gcore/types/waap/domains/statistic_get_traffic_series_response.py rename to src/gcore/types/waap/analytics_get_traffic_response.py index 2be7468d..1548c185 100644 --- a/src/gcore/types/waap/domains/statistic_get_traffic_series_response.py +++ b/src/gcore/types/waap/analytics_get_traffic_response.py @@ -5,6 +5,6 @@ from .waap_traffic_metrics import WaapTrafficMetrics -__all__ = ["StatisticGetTrafficSeriesResponse"] +__all__ = ["AnalyticsGetTrafficResponse"] -StatisticGetTrafficSeriesResponse: TypeAlias = List[WaapTrafficMetrics] +AnalyticsGetTrafficResponse: TypeAlias = List[WaapTrafficMetrics] diff --git a/src/gcore/types/waap/domains/__init__.py b/src/gcore/types/waap/domains/__init__.py index c2e3dc86..b443d6f9 100644 --- a/src/gcore/types/waap/domains/__init__.py +++ b/src/gcore/types/waap/domains/__init__.py @@ -15,8 +15,6 @@ from .api_path_list_params import APIPathListParams as APIPathListParams from .waap_insight_silence import WaapInsightSilence as WaapInsightSilence from .waap_request_details import WaapRequestDetails as WaapRequestDetails -from .waap_request_summary import WaapRequestSummary as WaapRequestSummary -from .waap_traffic_metrics import WaapTrafficMetrics as WaapTrafficMetrics from .setting_update_params import SettingUpdateParams as SettingUpdateParams from .waap_count_statistics import WaapCountStatistics as WaapCountStatistics from .waap_event_statistics import WaapEventStatistics as WaapEventStatistics @@ -39,12 +37,7 @@ from .statistic_get_ddos_info_params import StatisticGetDDOSInfoParams as StatisticGetDDOSInfoParams from .statistic_get_ddos_attacks_params import StatisticGetDDOSAttacksParams as StatisticGetDDOSAttacksParams from .custom_rule_delete_multiple_params import CustomRuleDeleteMultipleParams as CustomRuleDeleteMultipleParams -from .statistic_get_traffic_series_params import StatisticGetTrafficSeriesParams as StatisticGetTrafficSeriesParams from .firewall_rule_delete_multiple_params import FirewallRuleDeleteMultipleParams as FirewallRuleDeleteMultipleParams -from .statistic_get_requests_series_params import StatisticGetRequestsSeriesParams as StatisticGetRequestsSeriesParams -from .statistic_get_traffic_series_response import ( - StatisticGetTrafficSeriesResponse as StatisticGetTrafficSeriesResponse, -) from .statistic_get_events_aggregated_params import ( StatisticGetEventsAggregatedParams as StatisticGetEventsAggregatedParams, ) diff --git a/src/gcore/types/waap/domains/statistic_get_requests_series_params.py b/src/gcore/types/waap/domains/statistic_get_requests_series_params.py deleted file mode 100644 index ef36b532..00000000 --- a/src/gcore/types/waap/domains/statistic_get_requests_series_params.py +++ /dev/null @@ -1,74 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import List, Optional -from typing_extensions import Literal, Required, TypedDict - -from ...._types import SequenceNotStr - -__all__ = ["StatisticGetRequestsSeriesParams"] - - -class StatisticGetRequestsSeriesParams(TypedDict, total=False): - start: Required[str] - """Filter data items starting from a specified date in ISO 8601 format""" - - actions: List[Literal["allow", "block", "captcha", "handshake"]] - """Filter the response by actions.""" - - countries: SequenceNotStr[str] - """Filter the response by country codes in ISO 3166-1 alpha-2 format.""" - - end: Optional[str] - """Filter data items up to a specified end date in ISO 8601 format. - - If not provided, defaults to the current date and time. - """ - - ip: str - """Filter the response by IP.""" - - limit: int - """Number of items to return""" - - offset: int - """Number of items to skip""" - - ordering: str - """Sort the response by given field.""" - - reference_id: str - """Filter the response by reference ID.""" - - security_rule_name: str - """Filter the response by security rule name.""" - - status_code: int - """Filter the response by response code.""" - - traffic_types: List[ - Literal[ - "policy_allowed", - "policy_blocked", - "custom_rule_allowed", - "custom_blocked", - "legit_requests", - "sanctioned", - "dynamic", - "api", - "static", - "ajax", - "redirects", - "monitor", - "err_40x", - "err_50x", - "passed_to_origin", - "timeout", - "other", - "ddos", - "legit", - "monitored", - ] - ] - """Filter the response by traffic types.""" diff --git a/src/gcore/types/waap/waap_compact_traffic_metrics.py b/src/gcore/types/waap/waap_compact_traffic_metrics.py new file mode 100644 index 00000000..9c6b0e5b --- /dev/null +++ b/src/gcore/types/waap/waap_compact_traffic_metrics.py @@ -0,0 +1,32 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Optional + +from ..._models import BaseModel + +__all__ = ["WaapCompactTrafficMetrics"] + + +class WaapCompactTrafficMetrics(BaseModel): + """Represents the compact traffic metrics for a domain at a given time window""" + + timestamp: int + """UNIX timestamp indicating when the traffic data was recorded""" + + allowed: Optional[int] = None + """Traffic passed due to a permissive security rule""" + + blocked: Optional[int] = None + """Traffic blocked by a security policy, custom rule, or DDoS protection""" + + monitored: Optional[int] = None + """ + Traffic that was identified as malicious by security policies (for monitored + domains) + """ + + passed: Optional[int] = None + """ + Traffic (number of requests) that was passed to the origin and didn't trigger + any rules + """ diff --git a/src/gcore/types/waap/domains/waap_request_summary.py b/src/gcore/types/waap/waap_request_summary.py similarity index 98% rename from src/gcore/types/waap/domains/waap_request_summary.py rename to src/gcore/types/waap/waap_request_summary.py index 68be1c90..3e3926ab 100644 --- a/src/gcore/types/waap/domains/waap_request_summary.py +++ b/src/gcore/types/waap/waap_request_summary.py @@ -3,7 +3,7 @@ from typing import Optional from typing_extensions import Literal -from ...._models import BaseModel +from ..._models import BaseModel __all__ = ["WaapRequestSummary"] diff --git a/src/gcore/types/waap/waap_simple_event_statistics.py b/src/gcore/types/waap/waap_simple_event_statistics.py new file mode 100644 index 00000000..668763a6 --- /dev/null +++ b/src/gcore/types/waap/waap_simple_event_statistics.py @@ -0,0 +1,54 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Dict, List, Union, Optional +from typing_extensions import TypeAlias + +from ..._models import BaseModel + +__all__ = ["WaapSimpleEventStatistics", "Reference", "ReferenceIPReference", "ReferenceDomainReference"] + + +class ReferenceIPReference(BaseModel): + country: str + + org: str + + +class ReferenceDomainReference(BaseModel): + domain_id: int + + +Reference: TypeAlias = Union[ReferenceIPReference, ReferenceDomainReference] + + +class WaapSimpleEventStatistics(BaseModel): + """A collection of event counts per dimension values over a time span.""" + + allowed: List[List[object]] + """Number of requests passed due to a permissive security rule.""" + + blocked: List[List[object]] + """ + Number of blocked request events, with the same keys and formatted the same as + in the total field. + """ + + reference: Optional[Dict[str, Reference]] = None + """Additional information, depending on the selected dimension. + + Keys refer to the items in the result (first value of a tuple). + """ + + suppressed: List[List[object]] + """ + Number of requests observed in monitoring mode that would have been blocked + otherwise. + """ + + total: List[List[object]] + """Total number of observed requests. + + First element of the tuple is a key, the second one is its counter value. The + key refers to a point in the requested dimension (e.g., an IP address). Results + are ordered by the counter value in descending order. + """ diff --git a/src/gcore/types/waap/domains/waap_traffic_metrics.py b/src/gcore/types/waap/waap_traffic_metrics.py similarity index 98% rename from src/gcore/types/waap/domains/waap_traffic_metrics.py rename to src/gcore/types/waap/waap_traffic_metrics.py index b87d6c4b..e074596e 100644 --- a/src/gcore/types/waap/domains/waap_traffic_metrics.py +++ b/src/gcore/types/waap/waap_traffic_metrics.py @@ -4,7 +4,7 @@ from pydantic import Field as FieldInfo -from ...._models import BaseModel +from ..._models import BaseModel __all__ = ["WaapTrafficMetrics"] diff --git a/tests/api_resources/waap/domains/test_statistics.py b/tests/api_resources/waap/domains/test_statistics.py index da599e1c..e0745388 100644 --- a/tests/api_resources/waap/domains/test_statistics.py +++ b/tests/api_resources/waap/domains/test_statistics.py @@ -15,13 +15,9 @@ WaapDDOSInfo, WaapDDOSAttack, WaapRequestDetails, - WaapRequestSummary, WaapEventStatistics, - StatisticGetTrafficSeriesResponse, ) -# pyright: reportDeprecated=false - base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -209,118 +205,6 @@ def test_path_params_get_request_details(self, client: Gcore) -> None: domain_id=1, ) - @parametrize - def test_method_get_requests_series(self, client: Gcore) -> None: - with pytest.warns(DeprecationWarning): - statistic = client.waap.domains.statistics.get_requests_series( - domain_id=1, - start="2024-04-13T00:00:00+01:00", - ) - - assert_matches_type(SyncOffsetPage[WaapRequestSummary], statistic, path=["response"]) - - @parametrize - def test_method_get_requests_series_with_all_params(self, client: Gcore) -> None: - with pytest.warns(DeprecationWarning): - statistic = client.waap.domains.statistics.get_requests_series( - domain_id=1, - start="2024-04-13T00:00:00+01:00", - actions=["allow"], - countries=["Mv"], - end="2024-04-14T12:00:00Z", - ip=".:", - limit=0, - offset=0, - ordering="ordering", - reference_id="ad07c06f19054e484974fa22e9fb6bb1", - security_rule_name="security_rule_name", - status_code=100, - traffic_types=["policy_allowed"], - ) - - assert_matches_type(SyncOffsetPage[WaapRequestSummary], statistic, path=["response"]) - - @parametrize - def test_raw_response_get_requests_series(self, client: Gcore) -> None: - with pytest.warns(DeprecationWarning): - response = client.waap.domains.statistics.with_raw_response.get_requests_series( - domain_id=1, - start="2024-04-13T00:00:00+01:00", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - statistic = response.parse() - assert_matches_type(SyncOffsetPage[WaapRequestSummary], statistic, path=["response"]) - - @parametrize - def test_streaming_response_get_requests_series(self, client: Gcore) -> None: - with pytest.warns(DeprecationWarning): - with client.waap.domains.statistics.with_streaming_response.get_requests_series( - domain_id=1, - start="2024-04-13T00:00:00+01:00", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - statistic = response.parse() - assert_matches_type(SyncOffsetPage[WaapRequestSummary], statistic, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_method_get_traffic_series(self, client: Gcore) -> None: - with pytest.warns(DeprecationWarning): - statistic = client.waap.domains.statistics.get_traffic_series( - domain_id=1, - resolution="daily", - start="2024-04-13T00:00:00+01:00", - ) - - assert_matches_type(StatisticGetTrafficSeriesResponse, statistic, path=["response"]) - - @parametrize - def test_method_get_traffic_series_with_all_params(self, client: Gcore) -> None: - with pytest.warns(DeprecationWarning): - statistic = client.waap.domains.statistics.get_traffic_series( - domain_id=1, - resolution="daily", - start="2024-04-13T00:00:00+01:00", - end="2024-04-14T12:00:00Z", - ) - - assert_matches_type(StatisticGetTrafficSeriesResponse, statistic, path=["response"]) - - @parametrize - def test_raw_response_get_traffic_series(self, client: Gcore) -> None: - with pytest.warns(DeprecationWarning): - response = client.waap.domains.statistics.with_raw_response.get_traffic_series( - domain_id=1, - resolution="daily", - start="2024-04-13T00:00:00+01:00", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - statistic = response.parse() - assert_matches_type(StatisticGetTrafficSeriesResponse, statistic, path=["response"]) - - @parametrize - def test_streaming_response_get_traffic_series(self, client: Gcore) -> None: - with pytest.warns(DeprecationWarning): - with client.waap.domains.statistics.with_streaming_response.get_traffic_series( - domain_id=1, - resolution="daily", - start="2024-04-13T00:00:00+01:00", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - statistic = response.parse() - assert_matches_type(StatisticGetTrafficSeriesResponse, statistic, path=["response"]) - - assert cast(Any, response.is_closed) is True - class TestAsyncStatistics: parametrize = pytest.mark.parametrize( @@ -507,115 +391,3 @@ async def test_path_params_get_request_details(self, async_client: AsyncGcore) - request_id="", domain_id=1, ) - - @parametrize - async def test_method_get_requests_series(self, async_client: AsyncGcore) -> None: - with pytest.warns(DeprecationWarning): - statistic = await async_client.waap.domains.statistics.get_requests_series( - domain_id=1, - start="2024-04-13T00:00:00+01:00", - ) - - assert_matches_type(AsyncOffsetPage[WaapRequestSummary], statistic, path=["response"]) - - @parametrize - async def test_method_get_requests_series_with_all_params(self, async_client: AsyncGcore) -> None: - with pytest.warns(DeprecationWarning): - statistic = await async_client.waap.domains.statistics.get_requests_series( - domain_id=1, - start="2024-04-13T00:00:00+01:00", - actions=["allow"], - countries=["Mv"], - end="2024-04-14T12:00:00Z", - ip=".:", - limit=0, - offset=0, - ordering="ordering", - reference_id="ad07c06f19054e484974fa22e9fb6bb1", - security_rule_name="security_rule_name", - status_code=100, - traffic_types=["policy_allowed"], - ) - - assert_matches_type(AsyncOffsetPage[WaapRequestSummary], statistic, path=["response"]) - - @parametrize - async def test_raw_response_get_requests_series(self, async_client: AsyncGcore) -> None: - with pytest.warns(DeprecationWarning): - response = await async_client.waap.domains.statistics.with_raw_response.get_requests_series( - domain_id=1, - start="2024-04-13T00:00:00+01:00", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - statistic = await response.parse() - assert_matches_type(AsyncOffsetPage[WaapRequestSummary], statistic, path=["response"]) - - @parametrize - async def test_streaming_response_get_requests_series(self, async_client: AsyncGcore) -> None: - with pytest.warns(DeprecationWarning): - async with async_client.waap.domains.statistics.with_streaming_response.get_requests_series( - domain_id=1, - start="2024-04-13T00:00:00+01:00", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - statistic = await response.parse() - assert_matches_type(AsyncOffsetPage[WaapRequestSummary], statistic, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_method_get_traffic_series(self, async_client: AsyncGcore) -> None: - with pytest.warns(DeprecationWarning): - statistic = await async_client.waap.domains.statistics.get_traffic_series( - domain_id=1, - resolution="daily", - start="2024-04-13T00:00:00+01:00", - ) - - assert_matches_type(StatisticGetTrafficSeriesResponse, statistic, path=["response"]) - - @parametrize - async def test_method_get_traffic_series_with_all_params(self, async_client: AsyncGcore) -> None: - with pytest.warns(DeprecationWarning): - statistic = await async_client.waap.domains.statistics.get_traffic_series( - domain_id=1, - resolution="daily", - start="2024-04-13T00:00:00+01:00", - end="2024-04-14T12:00:00Z", - ) - - assert_matches_type(StatisticGetTrafficSeriesResponse, statistic, path=["response"]) - - @parametrize - async def test_raw_response_get_traffic_series(self, async_client: AsyncGcore) -> None: - with pytest.warns(DeprecationWarning): - response = await async_client.waap.domains.statistics.with_raw_response.get_traffic_series( - domain_id=1, - resolution="daily", - start="2024-04-13T00:00:00+01:00", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - statistic = await response.parse() - assert_matches_type(StatisticGetTrafficSeriesResponse, statistic, path=["response"]) - - @parametrize - async def test_streaming_response_get_traffic_series(self, async_client: AsyncGcore) -> None: - with pytest.warns(DeprecationWarning): - async with async_client.waap.domains.statistics.with_streaming_response.get_traffic_series( - domain_id=1, - resolution="daily", - start="2024-04-13T00:00:00+01:00", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - statistic = await response.parse() - assert_matches_type(StatisticGetTrafficSeriesResponse, statistic, path=["response"]) - - assert cast(Any, response.is_closed) is True diff --git a/tests/api_resources/waap/test_analytics.py b/tests/api_resources/waap/test_analytics.py new file mode 100644 index 00000000..7318725a --- /dev/null +++ b/tests/api_resources/waap/test_analytics.py @@ -0,0 +1,428 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from gcore import Gcore, AsyncGcore +from tests.utils import assert_matches_type +from gcore.pagination import SyncOffsetPage, AsyncOffsetPage +from gcore.types.waap import ( + WaapRequestSummary, + WaapSimpleEventStatistics, + AnalyticsGetTrafficResponse, + AnalyticsGetTrafficFilteredResponse, +) + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestAnalytics: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + def test_method_get_event_statistics(self, client: Gcore) -> None: + analytics = client.waap.analytics.get_event_statistics( + dimension="country", + start="2024-04-13T00:00:00+01:00", + ) + assert_matches_type(WaapSimpleEventStatistics, analytics, path=["response"]) + + @parametrize + def test_method_get_event_statistics_with_all_params(self, client: Gcore) -> None: + analytics = client.waap.analytics.get_event_statistics( + dimension="country", + start="2024-04-13T00:00:00+01:00", + domains=[1, 2, 3], + end="2024-04-14T12:00:00Z", + ips=["1.2.3.4", "2001:678:194::3c25:ddad"], + security_rule_names=["SQL injection"], + ) + assert_matches_type(WaapSimpleEventStatistics, analytics, path=["response"]) + + @parametrize + def test_raw_response_get_event_statistics(self, client: Gcore) -> None: + response = client.waap.analytics.with_raw_response.get_event_statistics( + dimension="country", + start="2024-04-13T00:00:00+01:00", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + analytics = response.parse() + assert_matches_type(WaapSimpleEventStatistics, analytics, path=["response"]) + + @parametrize + def test_streaming_response_get_event_statistics(self, client: Gcore) -> None: + with client.waap.analytics.with_streaming_response.get_event_statistics( + dimension="country", + start="2024-04-13T00:00:00+01:00", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + analytics = response.parse() + assert_matches_type(WaapSimpleEventStatistics, analytics, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_get_requests(self, client: Gcore) -> None: + analytics = client.waap.analytics.get_requests( + start="2024-04-13T00:00:00+01:00", + ) + assert_matches_type(SyncOffsetPage[WaapRequestSummary], analytics, path=["response"]) + + @parametrize + def test_method_get_requests_with_all_params(self, client: Gcore) -> None: + analytics = client.waap.analytics.get_requests( + start="2024-04-13T00:00:00+01:00", + countries=["DE", "MY"], + decision=["allowed", "blocked"], + domains=[1, 2, 3], + end="2024-04-14T12:00:00Z", + http_methods=["GET", "HEAD"], + ips=["1.2.3.4", " 2001:678:194::3c25:ddad"], + limit=0, + offset=0, + optional_action=["captcha", "challenge"], + ordering="userAgent", + path="/home", + reference_ids=["210b9798eb53baa4e69d31c1071cf03d"], + request_ids=["210b9798eb53baa4e69d31c1071cf03d-852383"], + security_rule_names=["SQL injection"], + session_ids=["210b9798eb53baa4e69d31c1071cf03d"], + status_codes=[100], + ) + assert_matches_type(SyncOffsetPage[WaapRequestSummary], analytics, path=["response"]) + + @parametrize + def test_raw_response_get_requests(self, client: Gcore) -> None: + response = client.waap.analytics.with_raw_response.get_requests( + start="2024-04-13T00:00:00+01:00", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + analytics = response.parse() + assert_matches_type(SyncOffsetPage[WaapRequestSummary], analytics, path=["response"]) + + @parametrize + def test_streaming_response_get_requests(self, client: Gcore) -> None: + with client.waap.analytics.with_streaming_response.get_requests( + start="2024-04-13T00:00:00+01:00", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + analytics = response.parse() + assert_matches_type(SyncOffsetPage[WaapRequestSummary], analytics, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_get_traffic(self, client: Gcore) -> None: + analytics = client.waap.analytics.get_traffic( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) + assert_matches_type(AnalyticsGetTrafficResponse, analytics, path=["response"]) + + @parametrize + def test_method_get_traffic_with_all_params(self, client: Gcore) -> None: + analytics = client.waap.analytics.get_traffic( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + domains=[1, 2, 3], + end="2024-04-14T12:00:00Z", + ) + assert_matches_type(AnalyticsGetTrafficResponse, analytics, path=["response"]) + + @parametrize + def test_raw_response_get_traffic(self, client: Gcore) -> None: + response = client.waap.analytics.with_raw_response.get_traffic( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + analytics = response.parse() + assert_matches_type(AnalyticsGetTrafficResponse, analytics, path=["response"]) + + @parametrize + def test_streaming_response_get_traffic(self, client: Gcore) -> None: + with client.waap.analytics.with_streaming_response.get_traffic( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + analytics = response.parse() + assert_matches_type(AnalyticsGetTrafficResponse, analytics, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_get_traffic_filtered(self, client: Gcore) -> None: + analytics = client.waap.analytics.get_traffic_filtered( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) + assert_matches_type(AnalyticsGetTrafficFilteredResponse, analytics, path=["response"]) + + @parametrize + def test_method_get_traffic_filtered_with_all_params(self, client: Gcore) -> None: + analytics = client.waap.analytics.get_traffic_filtered( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + countries=["DE", "MY"], + decision=["allowed", "blocked"], + domains=[1, 2, 3], + end="2024-04-14T12:00:00Z", + http_methods=["GET", "HEAD"], + ips=["1.2.3.4", " 2001:678:194::3c25:ddad"], + optional_action=["captcha", "challenge"], + path="/home", + reference_ids=["210b9798eb53baa4e69d31c1071cf03d"], + request_ids=["210b9798eb53baa4e69d31c1071cf03d-852383"], + security_rule_names=["SQL injection"], + session_ids=["210b9798eb53baa4e69d31c1071cf03d"], + status_codes=[100], + ) + assert_matches_type(AnalyticsGetTrafficFilteredResponse, analytics, path=["response"]) + + @parametrize + def test_raw_response_get_traffic_filtered(self, client: Gcore) -> None: + response = client.waap.analytics.with_raw_response.get_traffic_filtered( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + analytics = response.parse() + assert_matches_type(AnalyticsGetTrafficFilteredResponse, analytics, path=["response"]) + + @parametrize + def test_streaming_response_get_traffic_filtered(self, client: Gcore) -> None: + with client.waap.analytics.with_streaming_response.get_traffic_filtered( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + analytics = response.parse() + assert_matches_type(AnalyticsGetTrafficFilteredResponse, analytics, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncAnalytics: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_get_event_statistics(self, async_client: AsyncGcore) -> None: + analytics = await async_client.waap.analytics.get_event_statistics( + dimension="country", + start="2024-04-13T00:00:00+01:00", + ) + assert_matches_type(WaapSimpleEventStatistics, analytics, path=["response"]) + + @parametrize + async def test_method_get_event_statistics_with_all_params(self, async_client: AsyncGcore) -> None: + analytics = await async_client.waap.analytics.get_event_statistics( + dimension="country", + start="2024-04-13T00:00:00+01:00", + domains=[1, 2, 3], + end="2024-04-14T12:00:00Z", + ips=["1.2.3.4", "2001:678:194::3c25:ddad"], + security_rule_names=["SQL injection"], + ) + assert_matches_type(WaapSimpleEventStatistics, analytics, path=["response"]) + + @parametrize + async def test_raw_response_get_event_statistics(self, async_client: AsyncGcore) -> None: + response = await async_client.waap.analytics.with_raw_response.get_event_statistics( + dimension="country", + start="2024-04-13T00:00:00+01:00", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + analytics = await response.parse() + assert_matches_type(WaapSimpleEventStatistics, analytics, path=["response"]) + + @parametrize + async def test_streaming_response_get_event_statistics(self, async_client: AsyncGcore) -> None: + async with async_client.waap.analytics.with_streaming_response.get_event_statistics( + dimension="country", + start="2024-04-13T00:00:00+01:00", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + analytics = await response.parse() + assert_matches_type(WaapSimpleEventStatistics, analytics, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_get_requests(self, async_client: AsyncGcore) -> None: + analytics = await async_client.waap.analytics.get_requests( + start="2024-04-13T00:00:00+01:00", + ) + assert_matches_type(AsyncOffsetPage[WaapRequestSummary], analytics, path=["response"]) + + @parametrize + async def test_method_get_requests_with_all_params(self, async_client: AsyncGcore) -> None: + analytics = await async_client.waap.analytics.get_requests( + start="2024-04-13T00:00:00+01:00", + countries=["DE", "MY"], + decision=["allowed", "blocked"], + domains=[1, 2, 3], + end="2024-04-14T12:00:00Z", + http_methods=["GET", "HEAD"], + ips=["1.2.3.4", " 2001:678:194::3c25:ddad"], + limit=0, + offset=0, + optional_action=["captcha", "challenge"], + ordering="userAgent", + path="/home", + reference_ids=["210b9798eb53baa4e69d31c1071cf03d"], + request_ids=["210b9798eb53baa4e69d31c1071cf03d-852383"], + security_rule_names=["SQL injection"], + session_ids=["210b9798eb53baa4e69d31c1071cf03d"], + status_codes=[100], + ) + assert_matches_type(AsyncOffsetPage[WaapRequestSummary], analytics, path=["response"]) + + @parametrize + async def test_raw_response_get_requests(self, async_client: AsyncGcore) -> None: + response = await async_client.waap.analytics.with_raw_response.get_requests( + start="2024-04-13T00:00:00+01:00", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + analytics = await response.parse() + assert_matches_type(AsyncOffsetPage[WaapRequestSummary], analytics, path=["response"]) + + @parametrize + async def test_streaming_response_get_requests(self, async_client: AsyncGcore) -> None: + async with async_client.waap.analytics.with_streaming_response.get_requests( + start="2024-04-13T00:00:00+01:00", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + analytics = await response.parse() + assert_matches_type(AsyncOffsetPage[WaapRequestSummary], analytics, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_get_traffic(self, async_client: AsyncGcore) -> None: + analytics = await async_client.waap.analytics.get_traffic( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) + assert_matches_type(AnalyticsGetTrafficResponse, analytics, path=["response"]) + + @parametrize + async def test_method_get_traffic_with_all_params(self, async_client: AsyncGcore) -> None: + analytics = await async_client.waap.analytics.get_traffic( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + domains=[1, 2, 3], + end="2024-04-14T12:00:00Z", + ) + assert_matches_type(AnalyticsGetTrafficResponse, analytics, path=["response"]) + + @parametrize + async def test_raw_response_get_traffic(self, async_client: AsyncGcore) -> None: + response = await async_client.waap.analytics.with_raw_response.get_traffic( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + analytics = await response.parse() + assert_matches_type(AnalyticsGetTrafficResponse, analytics, path=["response"]) + + @parametrize + async def test_streaming_response_get_traffic(self, async_client: AsyncGcore) -> None: + async with async_client.waap.analytics.with_streaming_response.get_traffic( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + analytics = await response.parse() + assert_matches_type(AnalyticsGetTrafficResponse, analytics, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_get_traffic_filtered(self, async_client: AsyncGcore) -> None: + analytics = await async_client.waap.analytics.get_traffic_filtered( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) + assert_matches_type(AnalyticsGetTrafficFilteredResponse, analytics, path=["response"]) + + @parametrize + async def test_method_get_traffic_filtered_with_all_params(self, async_client: AsyncGcore) -> None: + analytics = await async_client.waap.analytics.get_traffic_filtered( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + countries=["DE", "MY"], + decision=["allowed", "blocked"], + domains=[1, 2, 3], + end="2024-04-14T12:00:00Z", + http_methods=["GET", "HEAD"], + ips=["1.2.3.4", " 2001:678:194::3c25:ddad"], + optional_action=["captcha", "challenge"], + path="/home", + reference_ids=["210b9798eb53baa4e69d31c1071cf03d"], + request_ids=["210b9798eb53baa4e69d31c1071cf03d-852383"], + security_rule_names=["SQL injection"], + session_ids=["210b9798eb53baa4e69d31c1071cf03d"], + status_codes=[100], + ) + assert_matches_type(AnalyticsGetTrafficFilteredResponse, analytics, path=["response"]) + + @parametrize + async def test_raw_response_get_traffic_filtered(self, async_client: AsyncGcore) -> None: + response = await async_client.waap.analytics.with_raw_response.get_traffic_filtered( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + analytics = await response.parse() + assert_matches_type(AnalyticsGetTrafficFilteredResponse, analytics, path=["response"]) + + @parametrize + async def test_streaming_response_get_traffic_filtered(self, async_client: AsyncGcore) -> None: + async with async_client.waap.analytics.with_streaming_response.get_traffic_filtered( + resolution="daily", + start="2024-04-13T00:00:00+01:00", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + analytics = await response.parse() + assert_matches_type(AnalyticsGetTrafficFilteredResponse, analytics, path=["response"]) + + assert cast(Any, response.is_closed) is True From c4dbd22cb198bc087fa998a4b090997dc4078103 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 15:42:36 +0000 Subject: [PATCH 15/25] fix: sanitize endpoint path params --- src/gcore/_utils/__init__.py | 1 + src/gcore/_utils/_path.py | 127 +++++++++++++ src/gcore/resources/cdn/audit_logs.py | 6 +- .../cdn/cdn_resources/cdn_resources.py | 30 +-- .../resources/cdn/cdn_resources/rules.py | 26 +-- .../resources/cdn/cdn_resources/shield.py | 10 +- src/gcore/resources/cdn/certificates.py | 26 +-- .../resources/cdn/logs_uploader/configs.py | 22 +-- .../resources/cdn/logs_uploader/policies.py | 18 +- .../resources/cdn/logs_uploader/targets.py | 22 +-- src/gcore/resources/cdn/origin_groups.py | 18 +- src/gcore/resources/cdn/rule_templates.py | 18 +- .../resources/cdn/trusted_ca_certificates.py | 14 +- .../resources/cloud/baremetal/flavors.py | 6 +- src/gcore/resources/cloud/baremetal/images.py | 6 +- .../resources/cloud/baremetal/servers.py | 66 +++++-- .../databases/postgres/clusters/clusters.py | 60 ++++-- .../postgres/clusters/user_credentials.py | 33 +++- .../databases/postgres/configurations.py | 13 +- .../postgres/custom_configurations.py | 14 +- .../cloud/file_shares/access_rules.py | 46 ++++- .../cloud/file_shares/file_shares.py | 66 +++++-- src/gcore/resources/cloud/floating_ips.py | 80 ++++++-- .../cloud/gpu_baremetal/clusters/clusters.py | 130 ++++++++++--- .../cloud/gpu_baremetal/clusters/flavors.py | 10 +- .../cloud/gpu_baremetal/clusters/images.py | 46 ++++- .../gpu_baremetal/clusters/interfaces.py | 44 ++++- .../cloud/gpu_baremetal/clusters/servers.py | 90 +++++++-- .../cloud/gpu_virtual/clusters/clusters.py | 74 ++++++-- .../cloud/gpu_virtual/clusters/flavors.py | 10 +- .../cloud/gpu_virtual/clusters/images.py | 46 ++++- .../cloud/gpu_virtual/clusters/interfaces.py | 15 +- .../cloud/gpu_virtual/clusters/servers.py | 32 +++- .../cloud/gpu_virtual/clusters/volumes.py | 15 +- .../resources/cloud/inference/api_keys.py | 46 +++-- .../inference/applications/deployments.py | 46 +++-- .../cloud/inference/applications/templates.py | 9 +- .../inference/deployments/deployments.py | 82 ++++++-- .../cloud/inference/deployments/logs.py | 14 +- .../resources/cloud/inference/flavors.py | 6 +- .../cloud/inference/registry_credentials.py | 46 +++-- .../resources/cloud/inference/secrets.py | 34 ++-- .../resources/cloud/instances/flavors.py | 6 +- src/gcore/resources/cloud/instances/images.py | 60 ++++-- .../resources/cloud/instances/instances.py | 178 +++++++++++++++--- .../resources/cloud/instances/interfaces.py | 44 ++++- .../resources/cloud/instances/metrics.py | 16 +- .../resources/cloud/k8s/clusters/clusters.py | 102 ++++++++-- .../cloud/k8s/clusters/kubeconfig.py | 15 +- .../resources/cloud/k8s/clusters/nodes.py | 32 +++- .../cloud/k8s/clusters/pools/nodes.py | 36 +++- .../cloud/k8s/clusters/pools/pools.py | 106 +++++++++-- src/gcore/resources/cloud/k8s/flavors.py | 6 +- src/gcore/resources/cloud/k8s/k8s.py | 9 +- .../resources/cloud/load_balancers/flavors.py | 6 +- .../load_balancers/l7_policies/l7_policies.py | 52 +++-- .../cloud/load_balancers/l7_policies/rules.py | 78 ++++++-- .../cloud/load_balancers/listeners.py | 52 +++-- .../cloud/load_balancers/load_balancers.py | 88 +++++++-- .../resources/cloud/load_balancers/metrics.py | 16 +- .../load_balancers/pools/health_monitors.py | 30 ++- .../cloud/load_balancers/pools/members.py | 32 +++- .../cloud/load_balancers/pools/pools.py | 52 +++-- .../cloud/load_balancers/statuses.py | 23 ++- .../resources/cloud/networks/networks.py | 52 +++-- src/gcore/resources/cloud/networks/routers.py | 80 ++++++-- src/gcore/resources/cloud/networks/subnets.py | 52 +++-- src/gcore/resources/cloud/placement_groups.py | 46 ++++- src/gcore/resources/cloud/projects.py | 14 +- src/gcore/resources/cloud/quotas/quotas.py | 13 +- src/gcore/resources/cloud/quotas/requests.py | 10 +- src/gcore/resources/cloud/regions.py | 6 +- .../resources/cloud/registries/artifacts.py | 35 +++- .../resources/cloud/registries/registries.py | 52 +++-- .../cloud/registries/repositories.py | 31 ++- src/gcore/resources/cloud/registries/tags.py | 21 ++- src/gcore/resources/cloud/registries/users.py | 92 +++++++-- .../reserved_fixed_ips/reserved_fixed_ips.py | 60 ++++-- .../reserved_fixed_ips/vip/candidate_ports.py | 15 +- .../reserved_fixed_ips/vip/connected_ports.py | 44 ++++- .../cloud/reserved_fixed_ips/vip/vip.py | 16 +- src/gcore/resources/cloud/secrets.py | 38 +++- .../resources/cloud/security_groups/rules.py | 46 ++++- .../cloud/security_groups/security_groups.py | 88 +++++++-- src/gcore/resources/cloud/ssh_keys.py | 22 +-- src/gcore/resources/cloud/tasks.py | 10 +- .../resources/cloud/users/role_assignments.py | 10 +- src/gcore/resources/cloud/volume_snapshots.py | 48 ++++- src/gcore/resources/cloud/volumes.py | 122 +++++++++--- src/gcore/resources/dns/network_mappings.py | 18 +- src/gcore/resources/dns/zones/dnssec.py | 10 +- src/gcore/resources/dns/zones/rrsets.py | 76 ++++++-- src/gcore/resources/dns/zones/zones.py | 38 ++-- src/gcore/resources/fastedge/apps/apps.py | 18 +- src/gcore/resources/fastedge/apps/logs.py | 6 +- src/gcore/resources/fastedge/binaries.py | 9 +- src/gcore/resources/fastedge/kv_stores.py | 14 +- src/gcore/resources/fastedge/secrets.py | 18 +- src/gcore/resources/fastedge/templates.py | 14 +- src/gcore/resources/iam/api_tokens.py | 18 +- src/gcore/resources/iam/users.py | 14 +- src/gcore/resources/security/profiles.py | 18 +- .../resources/storage/buckets/buckets.py | 30 ++- src/gcore/resources/storage/buckets/cors.py | 26 ++- .../resources/storage/buckets/lifecycle.py | 26 ++- src/gcore/resources/storage/buckets/policy.py | 37 +++- src/gcore/resources/storage/credentials.py | 6 +- src/gcore/resources/storage/storage.py | 38 ++-- src/gcore/resources/streaming/ai_tasks.py | 10 +- src/gcore/resources/streaming/broadcasts.py | 18 +- src/gcore/resources/streaming/directories.py | 14 +- src/gcore/resources/streaming/players.py | 18 +- .../streaming/playlists/playlists.py | 14 +- .../resources/streaming/playlists/videos.py | 5 +- src/gcore/resources/streaming/restreams.py | 14 +- .../resources/streaming/streams/clips.py | 10 +- .../resources/streaming/streams/overlays.py | 38 ++-- .../resources/streaming/streams/streams.py | 26 +-- .../resources/streaming/videos/subtitles.py | 22 +-- .../resources/streaming/videos/videos.py | 18 +- src/gcore/resources/waap/analytics.py | 6 +- src/gcore/resources/waap/custom_page_sets.py | 14 +- .../resources/waap/domains/advanced_rules.py | 48 +++-- .../waap/domains/api_discovery/openapi.py | 10 +- .../domains/api_discovery/scan_results.py | 18 +- .../waap/domains/api_discovery/settings.py | 10 +- .../resources/waap/domains/api_path_groups.py | 5 +- src/gcore/resources/waap/domains/api_paths.py | 22 +-- .../resources/waap/domains/custom_rules.py | 40 ++-- src/gcore/resources/waap/domains/domains.py | 18 +- .../resources/waap/domains/firewall_rules.py | 52 +++-- .../waap/domains/insight_silences.py | 34 ++-- src/gcore/resources/waap/domains/insights.py | 22 ++- src/gcore/resources/waap/domains/policies.py | 9 +- src/gcore/resources/waap/domains/settings.py | 10 +- .../resources/waap/domains/statistics.py | 22 ++- tests/test_utils/test_path.py | 89 +++++++++ 137 files changed, 3563 insertions(+), 1092 deletions(-) create mode 100644 src/gcore/_utils/_path.py create mode 100644 tests/test_utils/test_path.py diff --git a/src/gcore/_utils/__init__.py b/src/gcore/_utils/__init__.py index dc64e29a..10cb66d2 100644 --- a/src/gcore/_utils/__init__.py +++ b/src/gcore/_utils/__init__.py @@ -1,3 +1,4 @@ +from ._path import path_template as path_template from ._sync import asyncify as asyncify from ._proxy import LazyProxy as LazyProxy from ._utils import ( diff --git a/src/gcore/_utils/_path.py b/src/gcore/_utils/_path.py new file mode 100644 index 00000000..4d6e1e4c --- /dev/null +++ b/src/gcore/_utils/_path.py @@ -0,0 +1,127 @@ +from __future__ import annotations + +import re +from typing import ( + Any, + Mapping, + Callable, +) +from urllib.parse import quote + +# Matches '.' or '..' where each dot is either literal or percent-encoded (%2e / %2E). +_DOT_SEGMENT_RE = re.compile(r"^(?:\.|%2[eE]){1,2}$") + +_PLACEHOLDER_RE = re.compile(r"\{(\w+)\}") + + +def _quote_path_segment_part(value: str) -> str: + """Percent-encode `value` for use in a URI path segment. + + Considers characters not in `pchar` set from RFC 3986 §3.3 to be unsafe. + https://datatracker.ietf.org/doc/html/rfc3986#section-3.3 + """ + # quote() already treats unreserved characters (letters, digits, and -._~) + # as safe, so we only need to add sub-delims, ':', and '@'. + # Notably, unlike the default `safe` for quote(), / is unsafe and must be quoted. + return quote(value, safe="!$&'()*+,;=:@") + + +def _quote_query_part(value: str) -> str: + """Percent-encode `value` for use in a URI query string. + + Considers &, = and characters not in `query` set from RFC 3986 §3.4 to be unsafe. + https://datatracker.ietf.org/doc/html/rfc3986#section-3.4 + """ + return quote(value, safe="!$'()*+,;:@/?") + + +def _quote_fragment_part(value: str) -> str: + """Percent-encode `value` for use in a URI fragment. + + Considers characters not in `fragment` set from RFC 3986 §3.5 to be unsafe. + https://datatracker.ietf.org/doc/html/rfc3986#section-3.5 + """ + return quote(value, safe="!$&'()*+,;=:@/?") + + +def _interpolate( + template: str, + values: Mapping[str, Any], + quoter: Callable[[str], str], +) -> str: + """Replace {name} placeholders in `template`, quoting each value with `quoter`. + + Placeholder names are looked up in `values`. + + Raises: + KeyError: If a placeholder is not found in `values`. + """ + # re.split with a capturing group returns alternating + # [text, name, text, name, ..., text] elements. + parts = _PLACEHOLDER_RE.split(template) + + for i in range(1, len(parts), 2): + name = parts[i] + if name not in values: + raise KeyError(f"a value for placeholder {{{name}}} was not provided") + val = values[name] + if val is None: + parts[i] = "null" + elif isinstance(val, bool): + parts[i] = "true" if val else "false" + else: + parts[i] = quoter(str(values[name])) + + return "".join(parts) + + +def path_template(template: str, /, **kwargs: Any) -> str: + """Interpolate {name} placeholders in `template` from keyword arguments. + + Args: + template: The template string containing {name} placeholders. + **kwargs: Keyword arguments to interpolate into the template. + + Returns: + The template with placeholders interpolated and percent-encoded. + + Safe characters for percent-encoding are dependent on the URI component. + Placeholders in path and fragment portions are percent-encoded where the `segment` + and `fragment` sets from RFC 3986 respectively are considered safe. + Placeholders in the query portion are percent-encoded where the `query` set from + RFC 3986 §3.3 is considered safe except for = and & characters. + + Raises: + KeyError: If a placeholder is not found in `kwargs`. + ValueError: If resulting path contains /./ or /../ segments (including percent-encoded dot-segments). + """ + # Split the template into path, query, and fragment portions. + fragment_template: str | None = None + query_template: str | None = None + + rest = template + if "#" in rest: + rest, fragment_template = rest.split("#", 1) + if "?" in rest: + rest, query_template = rest.split("?", 1) + path_template = rest + + # Interpolate each portion with the appropriate quoting rules. + path_result = _interpolate(path_template, kwargs, _quote_path_segment_part) + + # Reject dot-segments (. and ..) in the final assembled path. The check + # runs after interpolation so that adjacent placeholders or a mix of static + # text and placeholders that together form a dot-segment are caught. + # Also reject percent-encoded dot-segments to protect against incorrectly + # implemented normalization in servers/proxies. + for segment in path_result.split("/"): + if _DOT_SEGMENT_RE.match(segment): + raise ValueError(f"Constructed path {path_result!r} contains dot-segment {segment!r} which is not allowed") + + result = path_result + if query_template is not None: + result += "?" + _interpolate(query_template, kwargs, _quote_query_part) + if fragment_template is not None: + result += "#" + _interpolate(fragment_template, kwargs, _quote_fragment_part) + + return result diff --git a/src/gcore/resources/cdn/audit_logs.py b/src/gcore/resources/cdn/audit_logs.py index 6bb97f1d..e8a608f6 100644 --- a/src/gcore/resources/cdn/audit_logs.py +++ b/src/gcore/resources/cdn/audit_logs.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform +from ..._utils import path_template, maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -187,7 +187,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/activity_log/requests/{log_id}", + path_template("/cdn/activity_log/requests/{log_id}", log_id=log_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -360,7 +360,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/activity_log/requests/{log_id}", + path_template("/cdn/activity_log/requests/{log_id}", log_id=log_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cdn/cdn_resources/cdn_resources.py b/src/gcore/resources/cdn/cdn_resources/cdn_resources.py index 8790b5c5..1661b305 100644 --- a/src/gcore/resources/cdn/cdn_resources/cdn_resources.py +++ b/src/gcore/resources/cdn/cdn_resources/cdn_resources.py @@ -24,7 +24,7 @@ AsyncShieldResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -330,7 +330,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/cdn/resources/{resource_id}", + path_template("/cdn/resources/{resource_id}", resource_id=resource_id), body=maybe_transform( { "active": active, @@ -528,7 +528,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cdn/resources/{resource_id}", + path_template("/cdn/resources/{resource_id}", resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -559,7 +559,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/resources/{resource_id}", + path_template("/cdn/resources/{resource_id}", resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -606,7 +606,7 @@ def prefetch( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/cdn/resources/{resource_id}/prefetch", + path_template("/cdn/resources/{resource_id}/prefetch", resource_id=resource_id), body=maybe_transform({"paths": paths}, cdn_resource_prefetch_params.CDNResourcePrefetchParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -639,7 +639,7 @@ def prevalidate_ssl_le_certificate( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/cdn/resources/{resource_id}/ssl/le/pre-validate", + path_template("/cdn/resources/{resource_id}/ssl/le/pre-validate", resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -814,7 +814,7 @@ def purge( ) -> None: extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/cdn/resources/{resource_id}/purge", + path_template("/cdn/resources/{resource_id}/purge", resource_id=resource_id), body=maybe_transform( { "urls": urls, @@ -933,7 +933,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/cdn/resources/{resource_id}", + path_template("/cdn/resources/{resource_id}", resource_id=resource_id), body=maybe_transform( { "origin_group": origin_group, @@ -1241,7 +1241,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/cdn/resources/{resource_id}", + path_template("/cdn/resources/{resource_id}", resource_id=resource_id), body=await async_maybe_transform( { "active": active, @@ -1439,7 +1439,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cdn/resources/{resource_id}", + path_template("/cdn/resources/{resource_id}", resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1470,7 +1470,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/resources/{resource_id}", + path_template("/cdn/resources/{resource_id}", resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1517,7 +1517,7 @@ async def prefetch( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/cdn/resources/{resource_id}/prefetch", + path_template("/cdn/resources/{resource_id}/prefetch", resource_id=resource_id), body=await async_maybe_transform({"paths": paths}, cdn_resource_prefetch_params.CDNResourcePrefetchParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -1550,7 +1550,7 @@ async def prevalidate_ssl_le_certificate( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/cdn/resources/{resource_id}/ssl/le/pre-validate", + path_template("/cdn/resources/{resource_id}/ssl/le/pre-validate", resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1725,7 +1725,7 @@ async def purge( ) -> None: extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/cdn/resources/{resource_id}/purge", + path_template("/cdn/resources/{resource_id}/purge", resource_id=resource_id), body=await async_maybe_transform( { "urls": urls, @@ -1844,7 +1844,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/cdn/resources/{resource_id}", + path_template("/cdn/resources/{resource_id}", resource_id=resource_id), body=await async_maybe_transform( { "origin_group": origin_group, diff --git a/src/gcore/resources/cdn/cdn_resources/rules.py b/src/gcore/resources/cdn/cdn_resources/rules.py index 6378ca6e..63e9f8ea 100644 --- a/src/gcore/resources/cdn/cdn_resources/rules.py +++ b/src/gcore/resources/cdn/cdn_resources/rules.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -134,7 +134,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/cdn/resources/{resource_id}/rules", + path_template("/cdn/resources/{resource_id}/rules", resource_id=resource_id), body=maybe_transform( { "name": name, @@ -240,7 +240,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/cdn/resources/{resource_id}/rules/{rule_id}", + path_template("/cdn/resources/{resource_id}/rules/{rule_id}", resource_id=resource_id, rule_id=rule_id), body=maybe_transform( { "active": active, @@ -284,7 +284,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/resources/{resource_id}/rules", + path_template("/cdn/resources/{resource_id}/rules", resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -324,7 +324,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cdn/resources/{resource_id}/rules/{rule_id}", + path_template("/cdn/resources/{resource_id}/rules/{rule_id}", resource_id=resource_id, rule_id=rule_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -356,7 +356,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/resources/{resource_id}/rules/{rule_id}", + path_template("/cdn/resources/{resource_id}/rules/{rule_id}", resource_id=resource_id, rule_id=rule_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -449,7 +449,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/cdn/resources/{resource_id}/rules/{rule_id}", + path_template("/cdn/resources/{resource_id}/rules/{rule_id}", resource_id=resource_id, rule_id=rule_id), body=maybe_transform( { "rule": rule, @@ -579,7 +579,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/cdn/resources/{resource_id}/rules", + path_template("/cdn/resources/{resource_id}/rules", resource_id=resource_id), body=await async_maybe_transform( { "name": name, @@ -685,7 +685,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/cdn/resources/{resource_id}/rules/{rule_id}", + path_template("/cdn/resources/{resource_id}/rules/{rule_id}", resource_id=resource_id, rule_id=rule_id), body=await async_maybe_transform( { "active": active, @@ -729,7 +729,7 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/resources/{resource_id}/rules", + path_template("/cdn/resources/{resource_id}/rules", resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -769,7 +769,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cdn/resources/{resource_id}/rules/{rule_id}", + path_template("/cdn/resources/{resource_id}/rules/{rule_id}", resource_id=resource_id, rule_id=rule_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -801,7 +801,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/resources/{resource_id}/rules/{rule_id}", + path_template("/cdn/resources/{resource_id}/rules/{rule_id}", resource_id=resource_id, rule_id=rule_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -894,7 +894,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/cdn/resources/{resource_id}/rules/{rule_id}", + path_template("/cdn/resources/{resource_id}/rules/{rule_id}", resource_id=resource_id, rule_id=rule_id), body=await async_maybe_transform( { "rule": rule, diff --git a/src/gcore/resources/cdn/cdn_resources/shield.py b/src/gcore/resources/cdn/cdn_resources/shield.py index 27c2bf2a..103e2518 100644 --- a/src/gcore/resources/cdn/cdn_resources/shield.py +++ b/src/gcore/resources/cdn/cdn_resources/shield.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -67,7 +67,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/resources/{resource_id}/shielding_v2", + path_template("/cdn/resources/{resource_id}/shielding_v2", resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -103,7 +103,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/cdn/resources/{resource_id}/shielding_v2", + path_template("/cdn/resources/{resource_id}/shielding_v2", resource_id=resource_id), body=maybe_transform({"shielding_pop": shielding_pop}, shield_replace_params.ShieldReplaceParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -156,7 +156,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/resources/{resource_id}/shielding_v2", + path_template("/cdn/resources/{resource_id}/shielding_v2", resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -192,7 +192,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/cdn/resources/{resource_id}/shielding_v2", + path_template("/cdn/resources/{resource_id}/shielding_v2", resource_id=resource_id), body=await async_maybe_transform( {"shielding_pop": shielding_pop}, shield_replace_params.ShieldReplaceParams ), diff --git a/src/gcore/resources/cdn/certificates.py b/src/gcore/resources/cdn/certificates.py index 51e11024..0e35bcac 100644 --- a/src/gcore/resources/cdn/certificates.py +++ b/src/gcore/resources/cdn/certificates.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import required_args, maybe_transform, async_maybe_transform +from ..._utils import path_template, required_args, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -268,7 +268,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cdn/sslData/{ssl_id}", + path_template("/cdn/sslData/{ssl_id}", ssl_id=ssl_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -301,7 +301,7 @@ def force_retry( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/cdn/sslData/{cert_id}/force-retry", + path_template("/cdn/sslData/{cert_id}/force-retry", cert_id=cert_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -332,7 +332,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/sslData/{ssl_id}", + path_template("/cdn/sslData/{ssl_id}", ssl_id=ssl_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -367,7 +367,7 @@ def get_status( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/sslData/{cert_id}/status", + path_template("/cdn/sslData/{cert_id}/status", cert_id=cert_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -405,7 +405,7 @@ def renew( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/cdn/sslData/{cert_id}/renew", + path_template("/cdn/sslData/{cert_id}/renew", cert_id=cert_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -460,7 +460,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/cdn/sslData/{ssl_id}", + path_template("/cdn/sslData/{ssl_id}", ssl_id=ssl_id), body=maybe_transform( { "name": name, @@ -715,7 +715,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cdn/sslData/{ssl_id}", + path_template("/cdn/sslData/{ssl_id}", ssl_id=ssl_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -748,7 +748,7 @@ async def force_retry( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/cdn/sslData/{cert_id}/force-retry", + path_template("/cdn/sslData/{cert_id}/force-retry", cert_id=cert_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -779,7 +779,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/sslData/{ssl_id}", + path_template("/cdn/sslData/{ssl_id}", ssl_id=ssl_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -814,7 +814,7 @@ async def get_status( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/sslData/{cert_id}/status", + path_template("/cdn/sslData/{cert_id}/status", cert_id=cert_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -854,7 +854,7 @@ async def renew( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/cdn/sslData/{cert_id}/renew", + path_template("/cdn/sslData/{cert_id}/renew", cert_id=cert_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -909,7 +909,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/cdn/sslData/{ssl_id}", + path_template("/cdn/sslData/{ssl_id}", ssl_id=ssl_id), body=await async_maybe_transform( { "name": name, diff --git a/src/gcore/resources/cdn/logs_uploader/configs.py b/src/gcore/resources/cdn/logs_uploader/configs.py index dacc13e1..131d1ce7 100644 --- a/src/gcore/resources/cdn/logs_uploader/configs.py +++ b/src/gcore/resources/cdn/logs_uploader/configs.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -163,7 +163,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/cdn/logs_uploader/configs/{id}", + path_template("/cdn/logs_uploader/configs/{id}", id=id), body=maybe_transform( { "enabled": enabled, @@ -257,7 +257,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cdn/logs_uploader/configs/{id}", + path_template("/cdn/logs_uploader/configs/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -288,7 +288,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/logs_uploader/configs/{id}", + path_template("/cdn/logs_uploader/configs/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -339,7 +339,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/cdn/logs_uploader/configs/{id}", + path_template("/cdn/logs_uploader/configs/{id}", id=id), body=maybe_transform( { "name": name, @@ -381,7 +381,7 @@ def validate( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/cdn/logs_uploader/configs/{id}/validate", + path_template("/cdn/logs_uploader/configs/{id}/validate", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -522,7 +522,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/cdn/logs_uploader/configs/{id}", + path_template("/cdn/logs_uploader/configs/{id}", id=id), body=await async_maybe_transform( { "enabled": enabled, @@ -616,7 +616,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cdn/logs_uploader/configs/{id}", + path_template("/cdn/logs_uploader/configs/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -647,7 +647,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/logs_uploader/configs/{id}", + path_template("/cdn/logs_uploader/configs/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -698,7 +698,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/cdn/logs_uploader/configs/{id}", + path_template("/cdn/logs_uploader/configs/{id}", id=id), body=await async_maybe_transform( { "name": name, @@ -740,7 +740,7 @@ async def validate( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/cdn/logs_uploader/configs/{id}/validate", + path_template("/cdn/logs_uploader/configs/{id}/validate", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cdn/logs_uploader/policies.py b/src/gcore/resources/cdn/logs_uploader/policies.py index 7cfd64c2..eabd7de8 100644 --- a/src/gcore/resources/cdn/logs_uploader/policies.py +++ b/src/gcore/resources/cdn/logs_uploader/policies.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -283,7 +283,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/cdn/logs_uploader/policies/{id}", + path_template("/cdn/logs_uploader/policies/{id}", id=id), body=maybe_transform( { "date_format": date_format, @@ -388,7 +388,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cdn/logs_uploader/policies/{id}", + path_template("/cdn/logs_uploader/policies/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -419,7 +419,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/logs_uploader/policies/{id}", + path_template("/cdn/logs_uploader/policies/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -543,7 +543,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/cdn/logs_uploader/policies/{id}", + path_template("/cdn/logs_uploader/policies/{id}", id=id), body=maybe_transform( { "date_format": date_format, @@ -825,7 +825,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/cdn/logs_uploader/policies/{id}", + path_template("/cdn/logs_uploader/policies/{id}", id=id), body=await async_maybe_transform( { "date_format": date_format, @@ -930,7 +930,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cdn/logs_uploader/policies/{id}", + path_template("/cdn/logs_uploader/policies/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -961,7 +961,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/logs_uploader/policies/{id}", + path_template("/cdn/logs_uploader/policies/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1085,7 +1085,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/cdn/logs_uploader/policies/{id}", + path_template("/cdn/logs_uploader/policies/{id}", id=id), body=await async_maybe_transform( { "date_format": date_format, diff --git a/src/gcore/resources/cdn/logs_uploader/targets.py b/src/gcore/resources/cdn/logs_uploader/targets.py index b43f30d8..5be0945e 100644 --- a/src/gcore/resources/cdn/logs_uploader/targets.py +++ b/src/gcore/resources/cdn/logs_uploader/targets.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -151,7 +151,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/cdn/logs_uploader/targets/{id}", + path_template("/cdn/logs_uploader/targets/{id}", id=id), body=maybe_transform( { "config": config, @@ -243,7 +243,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cdn/logs_uploader/targets/{id}", + path_template("/cdn/logs_uploader/targets/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -274,7 +274,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/logs_uploader/targets/{id}", + path_template("/cdn/logs_uploader/targets/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -319,7 +319,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/cdn/logs_uploader/targets/{id}", + path_template("/cdn/logs_uploader/targets/{id}", id=id), body=maybe_transform( { "config": config, @@ -359,7 +359,7 @@ def validate( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/cdn/logs_uploader/targets/{id}/validate", + path_template("/cdn/logs_uploader/targets/{id}/validate", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -487,7 +487,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/cdn/logs_uploader/targets/{id}", + path_template("/cdn/logs_uploader/targets/{id}", id=id), body=await async_maybe_transform( { "config": config, @@ -579,7 +579,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cdn/logs_uploader/targets/{id}", + path_template("/cdn/logs_uploader/targets/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -610,7 +610,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/logs_uploader/targets/{id}", + path_template("/cdn/logs_uploader/targets/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -655,7 +655,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/cdn/logs_uploader/targets/{id}", + path_template("/cdn/logs_uploader/targets/{id}", id=id), body=await async_maybe_transform( { "config": config, @@ -695,7 +695,7 @@ async def validate( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/cdn/logs_uploader/targets/{id}/validate", + path_template("/cdn/logs_uploader/targets/{id}/validate", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cdn/origin_groups.py b/src/gcore/resources/cdn/origin_groups.py index a1849be4..d9d2f73f 100644 --- a/src/gcore/resources/cdn/origin_groups.py +++ b/src/gcore/resources/cdn/origin_groups.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import required_args, maybe_transform, async_maybe_transform +from ..._utils import path_template, required_args, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -384,7 +384,7 @@ def update( return cast( OriginGroups, self._patch( - f"/cdn/origin_groups/{origin_group_id}", + path_template("/cdn/origin_groups/{origin_group_id}", origin_group_id=origin_group_id), body=maybe_transform( { "name": name, @@ -484,7 +484,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cdn/origin_groups/{origin_group_id}", + path_template("/cdn/origin_groups/{origin_group_id}", origin_group_id=origin_group_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -517,7 +517,7 @@ def get( return cast( OriginGroups, self._get( - f"/cdn/origin_groups/{origin_group_id}", + path_template("/cdn/origin_groups/{origin_group_id}", origin_group_id=origin_group_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -688,7 +688,7 @@ def replace( return cast( OriginGroups, self._put( - f"/cdn/origin_groups/{origin_group_id}", + path_template("/cdn/origin_groups/{origin_group_id}", origin_group_id=origin_group_id), body=maybe_transform( { "auth_type": auth_type, @@ -1063,7 +1063,7 @@ async def update( return cast( OriginGroups, await self._patch( - f"/cdn/origin_groups/{origin_group_id}", + path_template("/cdn/origin_groups/{origin_group_id}", origin_group_id=origin_group_id), body=await async_maybe_transform( { "name": name, @@ -1163,7 +1163,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cdn/origin_groups/{origin_group_id}", + path_template("/cdn/origin_groups/{origin_group_id}", origin_group_id=origin_group_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1196,7 +1196,7 @@ async def get( return cast( OriginGroups, await self._get( - f"/cdn/origin_groups/{origin_group_id}", + path_template("/cdn/origin_groups/{origin_group_id}", origin_group_id=origin_group_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1367,7 +1367,7 @@ async def replace( return cast( OriginGroups, await self._put( - f"/cdn/origin_groups/{origin_group_id}", + path_template("/cdn/origin_groups/{origin_group_id}", origin_group_id=origin_group_id), body=await async_maybe_transform( { "auth_type": auth_type, diff --git a/src/gcore/resources/cdn/rule_templates.py b/src/gcore/resources/cdn/rule_templates.py index 326b7811..86caf8e2 100644 --- a/src/gcore/resources/cdn/rule_templates.py +++ b/src/gcore/resources/cdn/rule_templates.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -204,7 +204,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/cdn/resources/rule_templates/{rule_template_id}", + path_template("/cdn/resources/rule_templates/{rule_template_id}", rule_template_id=rule_template_id), body=maybe_transform( { "name": name, @@ -266,7 +266,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cdn/resources/rule_templates/{rule_template_id}", + path_template("/cdn/resources/rule_templates/{rule_template_id}", rule_template_id=rule_template_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -297,7 +297,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/resources/rule_templates/{rule_template_id}", + path_template("/cdn/resources/rule_templates/{rule_template_id}", rule_template_id=rule_template_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -375,7 +375,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/cdn/resources/rule_templates/{rule_template_id}", + path_template("/cdn/resources/rule_templates/{rule_template_id}", rule_template_id=rule_template_id), body=maybe_transform( { "rule": rule, @@ -573,7 +573,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/cdn/resources/rule_templates/{rule_template_id}", + path_template("/cdn/resources/rule_templates/{rule_template_id}", rule_template_id=rule_template_id), body=await async_maybe_transform( { "name": name, @@ -635,7 +635,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cdn/resources/rule_templates/{rule_template_id}", + path_template("/cdn/resources/rule_templates/{rule_template_id}", rule_template_id=rule_template_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -666,7 +666,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/resources/rule_templates/{rule_template_id}", + path_template("/cdn/resources/rule_templates/{rule_template_id}", rule_template_id=rule_template_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -744,7 +744,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/cdn/resources/rule_templates/{rule_template_id}", + path_template("/cdn/resources/rule_templates/{rule_template_id}", rule_template_id=rule_template_id), body=await async_maybe_transform( { "rule": rule, diff --git a/src/gcore/resources/cdn/trusted_ca_certificates.py b/src/gcore/resources/cdn/trusted_ca_certificates.py index 1bd4d6dc..21e94c2d 100644 --- a/src/gcore/resources/cdn/trusted_ca_certificates.py +++ b/src/gcore/resources/cdn/trusted_ca_certificates.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -183,7 +183,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cdn/sslCertificates/{id}", + path_template("/cdn/sslCertificates/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -214,7 +214,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cdn/sslCertificates/{id}", + path_template("/cdn/sslCertificates/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -250,7 +250,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/cdn/sslCertificates/{id}", + path_template("/cdn/sslCertificates/{id}", id=id), body=maybe_transform( {"name": name}, trusted_ca_certificate_replace_params.TrustedCaCertificateReplaceParams ), @@ -418,7 +418,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cdn/sslCertificates/{id}", + path_template("/cdn/sslCertificates/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -449,7 +449,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cdn/sslCertificates/{id}", + path_template("/cdn/sslCertificates/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -485,7 +485,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/cdn/sslCertificates/{id}", + path_template("/cdn/sslCertificates/{id}", id=id), body=await async_maybe_transform( {"name": name}, trusted_ca_certificate_replace_params.TrustedCaCertificateReplaceParams ), diff --git a/src/gcore/resources/cloud/baremetal/flavors.py b/src/gcore/resources/cloud/baremetal/flavors.py index 454b0c7f..7f4a7812 100644 --- a/src/gcore/resources/cloud/baremetal/flavors.py +++ b/src/gcore/resources/cloud/baremetal/flavors.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -93,7 +93,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/bmflavors/{project_id}/{region_id}", + path_template("/cloud/v1/bmflavors/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -187,7 +187,7 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/bmflavors/{project_id}/{region_id}", + path_template("/cloud/v1/bmflavors/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/cloud/baremetal/images.py b/src/gcore/resources/cloud/baremetal/images.py index 16f4d22c..cbd700b5 100644 --- a/src/gcore/resources/cloud/baremetal/images.py +++ b/src/gcore/resources/cloud/baremetal/images.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -90,7 +90,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/bmimages/{project_id}/{region_id}", + path_template("/cloud/v1/bmimages/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -178,7 +178,7 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/bmimages/{project_id}/{region_id}", + path_template("/cloud/v1/bmimages/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/cloud/baremetal/servers.py b/src/gcore/resources/cloud/baremetal/servers.py index fc72c78d..172d6dbb 100644 --- a/src/gcore/resources/cloud/baremetal/servers.py +++ b/src/gcore/resources/cloud/baremetal/servers.py @@ -9,7 +9,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -169,7 +169,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/bminstances/{project_id}/{region_id}", + path_template("/cloud/v1/bminstances/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "flavor": flavor, @@ -258,7 +258,12 @@ def update( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return self._patch( - f"/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + path_template( + "/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + project_id=project_id, + region_id=region_id, + server_id=server_id, + ), body=maybe_transform( { "name": name, @@ -385,7 +390,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/bminstances/{project_id}/{region_id}", + path_template("/cloud/v1/bminstances/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=SyncOffsetPage[BaremetalServer], options=make_request_options( extra_headers=extra_headers, @@ -471,7 +476,12 @@ def delete( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return self._delete( - f"/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + path_template( + "/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + project_id=project_id, + region_id=region_id, + server_id=server_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -527,7 +537,12 @@ def get( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return self._get( - f"/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + path_template( + "/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + project_id=project_id, + region_id=region_id, + server_id=server_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -580,7 +595,12 @@ def rebuild( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return self._post( - f"/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}/rebuild", + path_template( + "/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}/rebuild", + project_id=project_id, + region_id=region_id, + server_id=server_id, + ), body=maybe_transform( { "image_id": image_id, @@ -851,7 +871,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/bminstances/{project_id}/{region_id}", + path_template("/cloud/v1/bminstances/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "flavor": flavor, @@ -940,7 +960,12 @@ async def update( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return await self._patch( - f"/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + path_template( + "/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + project_id=project_id, + region_id=region_id, + server_id=server_id, + ), body=await async_maybe_transform( { "name": name, @@ -1067,7 +1092,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/bminstances/{project_id}/{region_id}", + path_template("/cloud/v1/bminstances/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=AsyncOffsetPage[BaremetalServer], options=make_request_options( extra_headers=extra_headers, @@ -1153,7 +1178,12 @@ async def delete( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return await self._delete( - f"/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + path_template( + "/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + project_id=project_id, + region_id=region_id, + server_id=server_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1209,7 +1239,12 @@ async def get( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return await self._get( - f"/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + path_template( + "/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}", + project_id=project_id, + region_id=region_id, + server_id=server_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1262,7 +1297,12 @@ async def rebuild( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return await self._post( - f"/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}/rebuild", + path_template( + "/cloud/v1/bminstances/{project_id}/{region_id}/{server_id}/rebuild", + project_id=project_id, + region_id=region_id, + server_id=server_id, + ), body=await async_maybe_transform( { "image_id": image_id, diff --git a/src/gcore/resources/cloud/databases/postgres/clusters/clusters.py b/src/gcore/resources/cloud/databases/postgres/clusters/clusters.py index bb01ed8b..d4a91cca 100644 --- a/src/gcore/resources/cloud/databases/postgres/clusters/clusters.py +++ b/src/gcore/resources/cloud/databases/postgres/clusters/clusters.py @@ -7,7 +7,7 @@ import httpx from ......_types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ......_utils import maybe_transform, async_maybe_transform +from ......_utils import path_template, maybe_transform, async_maybe_transform from ......_compat import cached_property from ......_resource import SyncAPIResource, AsyncAPIResource from ......_response import ( @@ -105,7 +105,9 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "cluster_name": cluster_name, @@ -172,7 +174,12 @@ def update( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._patch( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), body=maybe_transform( { "databases": databases, @@ -228,7 +235,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), page=SyncOffsetPage[PostgresClusterShort], options=make_request_options( extra_headers=extra_headers, @@ -278,7 +287,12 @@ def delete( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._delete( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -317,7 +331,12 @@ def get( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._get( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -396,7 +415,9 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "cluster_name": cluster_name, @@ -463,7 +484,12 @@ async def update( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._patch( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), body=await async_maybe_transform( { "databases": databases, @@ -519,7 +545,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), page=AsyncOffsetPage[PostgresClusterShort], options=make_request_options( extra_headers=extra_headers, @@ -569,7 +597,12 @@ async def delete( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._delete( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -608,7 +641,12 @@ async def get( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._get( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/databases/postgres/clusters/user_credentials.py b/src/gcore/resources/cloud/databases/postgres/clusters/user_credentials.py index 98ad25be..b9792dc8 100644 --- a/src/gcore/resources/cloud/databases/postgres/clusters/user_credentials.py +++ b/src/gcore/resources/cloud/databases/postgres/clusters/user_credentials.py @@ -5,6 +5,7 @@ import httpx from ......_types import Body, Query, Headers, NotGiven, not_given +from ......_utils import path_template from ......_compat import cached_property from ......_resource import SyncAPIResource, AsyncAPIResource from ......_response import ( @@ -76,7 +77,13 @@ def get( if not username: raise ValueError(f"Expected a non-empty value for `username` but received {username!r}") return self._get( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}/users/{username}/credentials", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}/users/{username}/credentials", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + username=username, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -118,7 +125,13 @@ def regenerate( if not username: raise ValueError(f"Expected a non-empty value for `username` but received {username!r}") return self._post( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}/users/{username}/credentials", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}/users/{username}/credentials", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + username=username, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -183,7 +196,13 @@ async def get( if not username: raise ValueError(f"Expected a non-empty value for `username` but received {username!r}") return await self._get( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}/users/{username}/credentials", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}/users/{username}/credentials", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + username=username, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -225,7 +244,13 @@ async def regenerate( if not username: raise ValueError(f"Expected a non-empty value for `username` but received {username!r}") return await self._post( - f"/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}/users/{username}/credentials", + path_template( + "/cloud/v1/dbaas/postgres/clusters/{project_id}/{region_id}/{cluster_name}/users/{username}/credentials", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + username=username, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/databases/postgres/configurations.py b/src/gcore/resources/cloud/databases/postgres/configurations.py index c9f30551..6905b471 100644 --- a/src/gcore/resources/cloud/databases/postgres/configurations.py +++ b/src/gcore/resources/cloud/databases/postgres/configurations.py @@ -5,6 +5,7 @@ import httpx from ....._types import Body, Query, Headers, NotGiven, not_given +from ....._utils import path_template from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -68,7 +69,11 @@ def get( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/dbaas/postgres/configuration/{project_id}/{region_id}", + path_template( + "/cloud/v1/dbaas/postgres/configuration/{project_id}/{region_id}", + project_id=project_id, + region_id=region_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -125,7 +130,11 @@ async def get( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/dbaas/postgres/configuration/{project_id}/{region_id}", + path_template( + "/cloud/v1/dbaas/postgres/configuration/{project_id}/{region_id}", + project_id=project_id, + region_id=region_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/databases/postgres/custom_configurations.py b/src/gcore/resources/cloud/databases/postgres/custom_configurations.py index 9ce396df..d55243cb 100644 --- a/src/gcore/resources/cloud/databases/postgres/custom_configurations.py +++ b/src/gcore/resources/cloud/databases/postgres/custom_configurations.py @@ -5,7 +5,7 @@ import httpx from ....._types import Body, Query, Headers, NotGiven, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -76,7 +76,11 @@ def validate( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/dbaas/postgres/validate_pg_conf/{project_id}/{region_id}", + path_template( + "/cloud/v1/dbaas/postgres/validate_pg_conf/{project_id}/{region_id}", + project_id=project_id, + region_id=region_id, + ), body=maybe_transform( { "pg_conf": pg_conf, @@ -146,7 +150,11 @@ async def validate( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/dbaas/postgres/validate_pg_conf/{project_id}/{region_id}", + path_template( + "/cloud/v1/dbaas/postgres/validate_pg_conf/{project_id}/{region_id}", + project_id=project_id, + region_id=region_id, + ), body=await async_maybe_transform( { "pg_conf": pg_conf, diff --git a/src/gcore/resources/cloud/file_shares/access_rules.py b/src/gcore/resources/cloud/file_shares/access_rules.py index 259285ef..cbfe518d 100644 --- a/src/gcore/resources/cloud/file_shares/access_rules.py +++ b/src/gcore/resources/cloud/file_shares/access_rules.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Query, Headers, NoneType, NotGiven, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -92,7 +92,12 @@ def create( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return self._post( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), body=maybe_transform( { "access_mode": access_mode, @@ -144,7 +149,12 @@ def list( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return self._get( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -195,7 +205,13 @@ def delete( raise ValueError(f"Expected a non-empty value for `access_rule_id` but received {access_rule_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule/{access_rule_id}", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule/{access_rule_id}", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + access_rule_id=access_rule_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -271,7 +287,12 @@ async def create( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return await self._post( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), body=await async_maybe_transform( { "access_mode": access_mode, @@ -323,7 +344,12 @@ async def list( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return await self._get( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -374,7 +400,13 @@ async def delete( raise ValueError(f"Expected a non-empty value for `access_rule_id` but received {access_rule_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule/{access_rule_id}", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/access_rule/{access_rule_id}", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + access_rule_id=access_rule_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/file_shares/file_shares.py b/src/gcore/resources/cloud/file_shares/file_shares.py index fcf861eb..9a5bcfb4 100644 --- a/src/gcore/resources/cloud/file_shares/file_shares.py +++ b/src/gcore/resources/cloud/file_shares/file_shares.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import required_args, maybe_transform, async_maybe_transform +from ...._utils import path_template, required_args, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -215,7 +215,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/file_shares/{project_id}/{region_id}", + path_template("/cloud/v1/file_shares/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "name": name, @@ -303,7 +303,12 @@ def update( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return self._patch( - f"/cloud/v3/file_shares/{project_id}/{region_id}/{file_share_id}", + path_template( + "/cloud/v3/file_shares/{project_id}/{region_id}/{file_share_id}", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), body=maybe_transform( { "name": name, @@ -412,7 +417,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/file_shares/{project_id}/{region_id}", + path_template("/cloud/v1/file_shares/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=SyncOffsetPage[FileShare], options=make_request_options( extra_headers=extra_headers, @@ -470,7 +475,12 @@ def delete( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return self._delete( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -515,7 +525,12 @@ def get( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return self._get( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -563,7 +578,12 @@ def resize( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return self._post( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/extend", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/extend", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), body=maybe_transform({"size": size}, file_share_resize_params.FileShareResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -747,7 +767,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/file_shares/{project_id}/{region_id}", + path_template("/cloud/v1/file_shares/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "name": name, @@ -835,7 +855,12 @@ async def update( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return await self._patch( - f"/cloud/v3/file_shares/{project_id}/{region_id}/{file_share_id}", + path_template( + "/cloud/v3/file_shares/{project_id}/{region_id}/{file_share_id}", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), body=await async_maybe_transform( { "name": name, @@ -944,7 +969,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/file_shares/{project_id}/{region_id}", + path_template("/cloud/v1/file_shares/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=AsyncOffsetPage[FileShare], options=make_request_options( extra_headers=extra_headers, @@ -1002,7 +1027,12 @@ async def delete( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return await self._delete( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1047,7 +1077,12 @@ async def get( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return await self._get( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1095,7 +1130,12 @@ async def resize( if not file_share_id: raise ValueError(f"Expected a non-empty value for `file_share_id` but received {file_share_id!r}") return await self._post( - f"/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/extend", + path_template( + "/cloud/v1/file_shares/{project_id}/{region_id}/{file_share_id}/extend", + project_id=project_id, + region_id=region_id, + file_share_id=file_share_id, + ), body=await async_maybe_transform({"size": size}, file_share_resize_params.FileShareResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gcore/resources/cloud/floating_ips.py b/src/gcore/resources/cloud/floating_ips.py index f3b95468..984dfcc9 100644 --- a/src/gcore/resources/cloud/floating_ips.py +++ b/src/gcore/resources/cloud/floating_ips.py @@ -8,7 +8,7 @@ import httpx from ..._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -109,7 +109,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/floatingips/{project_id}/{region_id}", + path_template("/cloud/v1/floatingips/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "fixed_ip_address": fixed_ip_address, @@ -234,7 +234,12 @@ def update( if not floating_ip_id: raise ValueError(f"Expected a non-empty value for `floating_ip_id` but received {floating_ip_id!r}") return self._patch( - f"/cloud/v2/floatingips/{project_id}/{region_id}/{floating_ip_id}", + path_template( + "/cloud/v2/floatingips/{project_id}/{region_id}/{floating_ip_id}", + project_id=project_id, + region_id=region_id, + floating_ip_id=floating_ip_id, + ), body=maybe_transform( { "fixed_ip_address": fixed_ip_address, @@ -299,7 +304,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/floatingips/{project_id}/{region_id}", + path_template("/cloud/v1/floatingips/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=SyncOffsetPage[FloatingIPDetailed], options=make_request_options( extra_headers=extra_headers, @@ -358,7 +363,12 @@ def delete( if not floating_ip_id: raise ValueError(f"Expected a non-empty value for `floating_ip_id` but received {floating_ip_id!r}") return self._delete( - f"/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}", + path_template( + "/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}", + project_id=project_id, + region_id=region_id, + floating_ip_id=floating_ip_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -413,7 +423,12 @@ def assign( if not floating_ip_id: raise ValueError(f"Expected a non-empty value for `floating_ip_id` but received {floating_ip_id!r}") return self._post( - f"/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}/assign", + path_template( + "/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}/assign", + project_id=project_id, + region_id=region_id, + floating_ip_id=floating_ip_id, + ), body=maybe_transform( { "port_id": port_id, @@ -465,7 +480,12 @@ def get( if not floating_ip_id: raise ValueError(f"Expected a non-empty value for `floating_ip_id` but received {floating_ip_id!r}") return self._get( - f"/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}", + path_template( + "/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}", + project_id=project_id, + region_id=region_id, + floating_ip_id=floating_ip_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -512,7 +532,12 @@ def unassign( if not floating_ip_id: raise ValueError(f"Expected a non-empty value for `floating_ip_id` but received {floating_ip_id!r}") return self._post( - f"/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}/unassign", + path_template( + "/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}/unassign", + project_id=project_id, + region_id=region_id, + floating_ip_id=floating_ip_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -732,7 +757,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/floatingips/{project_id}/{region_id}", + path_template("/cloud/v1/floatingips/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "fixed_ip_address": fixed_ip_address, @@ -857,7 +882,12 @@ async def update( if not floating_ip_id: raise ValueError(f"Expected a non-empty value for `floating_ip_id` but received {floating_ip_id!r}") return await self._patch( - f"/cloud/v2/floatingips/{project_id}/{region_id}/{floating_ip_id}", + path_template( + "/cloud/v2/floatingips/{project_id}/{region_id}/{floating_ip_id}", + project_id=project_id, + region_id=region_id, + floating_ip_id=floating_ip_id, + ), body=await async_maybe_transform( { "fixed_ip_address": fixed_ip_address, @@ -922,7 +952,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/floatingips/{project_id}/{region_id}", + path_template("/cloud/v1/floatingips/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=AsyncOffsetPage[FloatingIPDetailed], options=make_request_options( extra_headers=extra_headers, @@ -981,7 +1011,12 @@ async def delete( if not floating_ip_id: raise ValueError(f"Expected a non-empty value for `floating_ip_id` but received {floating_ip_id!r}") return await self._delete( - f"/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}", + path_template( + "/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}", + project_id=project_id, + region_id=region_id, + floating_ip_id=floating_ip_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1036,7 +1071,12 @@ async def assign( if not floating_ip_id: raise ValueError(f"Expected a non-empty value for `floating_ip_id` but received {floating_ip_id!r}") return await self._post( - f"/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}/assign", + path_template( + "/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}/assign", + project_id=project_id, + region_id=region_id, + floating_ip_id=floating_ip_id, + ), body=await async_maybe_transform( { "port_id": port_id, @@ -1088,7 +1128,12 @@ async def get( if not floating_ip_id: raise ValueError(f"Expected a non-empty value for `floating_ip_id` but received {floating_ip_id!r}") return await self._get( - f"/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}", + path_template( + "/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}", + project_id=project_id, + region_id=region_id, + floating_ip_id=floating_ip_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1135,7 +1180,12 @@ async def unassign( if not floating_ip_id: raise ValueError(f"Expected a non-empty value for `floating_ip_id` but received {floating_ip_id!r}") return await self._post( - f"/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}/unassign", + path_template( + "/cloud/v1/floatingips/{project_id}/{region_id}/{floating_ip_id}/unassign", + project_id=project_id, + region_id=region_id, + floating_ip_id=floating_ip_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/gpu_baremetal/clusters/clusters.py b/src/gcore/resources/cloud/gpu_baremetal/clusters/clusters.py index acef14c3..cfd9a4a1 100644 --- a/src/gcore/resources/cloud/gpu_baremetal/clusters/clusters.py +++ b/src/gcore/resources/cloud/gpu_baremetal/clusters/clusters.py @@ -33,7 +33,7 @@ AsyncServersResourceWithStreamingResponse, ) from ....._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from .interfaces import ( InterfacesResource, AsyncInterfacesResource, @@ -161,7 +161,9 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "flavor": flavor, @@ -247,7 +249,12 @@ def update( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._patch( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), body=maybe_transform( { "name": name, @@ -307,7 +314,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters", project_id=project_id, region_id=region_id + ), page=SyncOffsetPage[GPUBaremetalCluster], options=make_request_options( extra_headers=extra_headers, @@ -378,7 +387,12 @@ def delete( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._delete( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -435,7 +449,12 @@ def get( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._get( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -477,7 +496,12 @@ def powercycle_all_servers( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._post( - f"/cloud/v2/ai/clusters/{project_id}/{region_id}/{cluster_id}/powercycle", + path_template( + "/cloud/v2/ai/clusters/{project_id}/{region_id}/{cluster_id}/powercycle", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -519,7 +543,12 @@ def reboot_all_servers( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._post( - f"/cloud/v2/ai/clusters/{project_id}/{region_id}/{cluster_id}/reboot", + path_template( + "/cloud/v2/ai/clusters/{project_id}/{region_id}/{cluster_id}/reboot", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -570,7 +599,12 @@ def rebuild( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._post( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/rebuild", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/rebuild", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -614,7 +648,12 @@ def resize( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._post( - f"/cloud/v1/ai/clusters/gpu/{project_id}/{region_id}/{cluster_id}/resize", + path_template( + "/cloud/v1/ai/clusters/gpu/{project_id}/{region_id}/{cluster_id}/resize", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), body=maybe_transform({"instances_count": instances_count}, cluster_resize_params.ClusterResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -671,7 +710,12 @@ def update_servers_settings( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._patch( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers_settings", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers_settings", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), body=maybe_transform( { "image_id": image_id, @@ -935,7 +979,9 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "flavor": flavor, @@ -1021,7 +1067,12 @@ async def update( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._patch( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), body=await async_maybe_transform( { "name": name, @@ -1081,7 +1132,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters", project_id=project_id, region_id=region_id + ), page=AsyncOffsetPage[GPUBaremetalCluster], options=make_request_options( extra_headers=extra_headers, @@ -1152,7 +1205,12 @@ async def delete( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._delete( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1209,7 +1267,12 @@ async def get( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._get( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1251,7 +1314,12 @@ async def powercycle_all_servers( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._post( - f"/cloud/v2/ai/clusters/{project_id}/{region_id}/{cluster_id}/powercycle", + path_template( + "/cloud/v2/ai/clusters/{project_id}/{region_id}/{cluster_id}/powercycle", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1293,7 +1361,12 @@ async def reboot_all_servers( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._post( - f"/cloud/v2/ai/clusters/{project_id}/{region_id}/{cluster_id}/reboot", + path_template( + "/cloud/v2/ai/clusters/{project_id}/{region_id}/{cluster_id}/reboot", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1344,7 +1417,12 @@ async def rebuild( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._post( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/rebuild", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/rebuild", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1388,7 +1466,12 @@ async def resize( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._post( - f"/cloud/v1/ai/clusters/gpu/{project_id}/{region_id}/{cluster_id}/resize", + path_template( + "/cloud/v1/ai/clusters/gpu/{project_id}/{region_id}/{cluster_id}/resize", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), body=await async_maybe_transform( {"instances_count": instances_count}, cluster_resize_params.ClusterResizeParams ), @@ -1447,7 +1530,12 @@ async def update_servers_settings( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._patch( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers_settings", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers_settings", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), body=await async_maybe_transform( { "image_id": image_id, diff --git a/src/gcore/resources/cloud/gpu_baremetal/clusters/flavors.py b/src/gcore/resources/cloud/gpu_baremetal/clusters/flavors.py index 486250ea..dfbcbe93 100644 --- a/src/gcore/resources/cloud/gpu_baremetal/clusters/flavors.py +++ b/src/gcore/resources/cloud/gpu_baremetal/clusters/flavors.py @@ -5,7 +5,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -80,7 +80,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/flavors", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/flavors", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -157,7 +159,9 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/flavors", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/flavors", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/cloud/gpu_baremetal/clusters/images.py b/src/gcore/resources/cloud/gpu_baremetal/clusters/images.py index 6a291c24..7c66d1e9 100644 --- a/src/gcore/resources/cloud/gpu_baremetal/clusters/images.py +++ b/src/gcore/resources/cloud/gpu_baremetal/clusters/images.py @@ -8,7 +8,7 @@ import httpx from ....._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -81,7 +81,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -126,7 +128,12 @@ def delete( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return self._delete( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images/{image_id}", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -209,7 +216,12 @@ def get( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return self._get( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images/{image_id}", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -285,7 +297,9 @@ def upload( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "name": name, @@ -431,7 +445,9 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -476,7 +492,12 @@ async def delete( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return await self._delete( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images/{image_id}", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -559,7 +580,12 @@ async def get( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return await self._get( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images/{image_id}", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -635,7 +661,9 @@ async def upload( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/images", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "name": name, diff --git a/src/gcore/resources/cloud/gpu_baremetal/clusters/interfaces.py b/src/gcore/resources/cloud/gpu_baremetal/clusters/interfaces.py index dcd6f5f0..9baaacf3 100644 --- a/src/gcore/resources/cloud/gpu_baremetal/clusters/interfaces.py +++ b/src/gcore/resources/cloud/gpu_baremetal/clusters/interfaces.py @@ -8,7 +8,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -77,7 +77,12 @@ def list( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._get( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{cluster_id}/interfaces", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{cluster_id}/interfaces", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -309,7 +314,12 @@ def attach( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/attach_interface", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/attach_interface", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform( { "ddos_profile": ddos_profile, @@ -368,7 +378,12 @@ def detach( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/detach_interface", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/detach_interface", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform( { "ip_address": ip_address, @@ -435,7 +450,12 @@ async def list( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._get( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{cluster_id}/interfaces", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{cluster_id}/interfaces", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -667,7 +687,12 @@ async def attach( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/attach_interface", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/attach_interface", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform( { "ddos_profile": ddos_profile, @@ -726,7 +751,12 @@ async def detach( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/detach_interface", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/detach_interface", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform( { "ip_address": ip_address, diff --git a/src/gcore/resources/cloud/gpu_baremetal/clusters/servers.py b/src/gcore/resources/cloud/gpu_baremetal/clusters/servers.py index 23ecc80b..5375060a 100644 --- a/src/gcore/resources/cloud/gpu_baremetal/clusters/servers.py +++ b/src/gcore/resources/cloud/gpu_baremetal/clusters/servers.py @@ -9,7 +9,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -138,7 +138,12 @@ def list( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._get_api_list( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), page=SyncOffsetPage[GPUBaremetalClusterServer], options=make_request_options( extra_headers=extra_headers, @@ -204,7 +209,13 @@ def delete( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._delete( - f"/cloud/v1/ai/clusters/gpu/{project_id}/{region_id}/{cluster_id}/node/{instance_id}", + path_template( + "/cloud/v1/ai/clusters/gpu/{project_id}/{region_id}/{cluster_id}/node/{instance_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -247,7 +258,12 @@ def get_console( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._get( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/get_console", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/get_console", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -286,7 +302,12 @@ def powercycle( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/powercycle", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/powercycle", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -325,7 +346,12 @@ def reboot( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/reboot", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/reboot", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -381,7 +407,13 @@ def rebuild( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return self._post( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers/{server_id}/rebuild", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers/{server_id}/rebuild", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + server_id=server_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -540,7 +572,12 @@ def list( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._get_api_list( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), page=AsyncOffsetPage[GPUBaremetalClusterServer], options=make_request_options( extra_headers=extra_headers, @@ -606,7 +643,13 @@ async def delete( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._delete( - f"/cloud/v1/ai/clusters/gpu/{project_id}/{region_id}/{cluster_id}/node/{instance_id}", + path_template( + "/cloud/v1/ai/clusters/gpu/{project_id}/{region_id}/{cluster_id}/node/{instance_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -651,7 +694,12 @@ async def get_console( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._get( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/get_console", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/get_console", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -690,7 +738,12 @@ async def powercycle( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/powercycle", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/powercycle", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -729,7 +782,12 @@ async def reboot( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/reboot", + path_template( + "/cloud/v1/ai/clusters/{project_id}/{region_id}/{instance_id}/reboot", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -785,7 +843,13 @@ async def rebuild( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return await self._post( - f"/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers/{server_id}/rebuild", + path_template( + "/cloud/v3/gpu/baremetal/{project_id}/{region_id}/clusters/{cluster_id}/servers/{server_id}/rebuild", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + server_id=server_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/gpu_virtual/clusters/clusters.py b/src/gcore/resources/cloud/gpu_virtual/clusters/clusters.py index 0cd97264..a5647c60 100644 --- a/src/gcore/resources/cloud/gpu_virtual/clusters/clusters.py +++ b/src/gcore/resources/cloud/gpu_virtual/clusters/clusters.py @@ -40,7 +40,7 @@ AsyncVolumesResourceWithStreamingResponse, ) from ....._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import required_args, maybe_transform, async_maybe_transform +from ....._utils import path_template, required_args, maybe_transform, async_maybe_transform from .interfaces import ( InterfacesResource, AsyncInterfacesResource, @@ -171,7 +171,9 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "flavor": flavor, @@ -256,7 +258,12 @@ def update( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._patch( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), body=maybe_transform( { "name": name, @@ -309,7 +316,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters", project_id=project_id, region_id=region_id + ), page=SyncOffsetPage[GPUVirtualCluster], options=make_request_options( extra_headers=extra_headers, @@ -385,7 +394,12 @@ def delete( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._delete( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -631,7 +645,12 @@ def action( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._post( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/action", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/action", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), body=maybe_transform( { "action": action, @@ -683,7 +702,12 @@ def get( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -789,7 +813,9 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "flavor": flavor, @@ -874,7 +900,12 @@ async def update( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._patch( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), body=await async_maybe_transform( { "name": name, @@ -927,7 +958,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters", project_id=project_id, region_id=region_id + ), page=AsyncOffsetPage[GPUVirtualCluster], options=make_request_options( extra_headers=extra_headers, @@ -1003,7 +1036,12 @@ async def delete( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._delete( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1249,7 +1287,12 @@ async def action( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._post( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/action", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/action", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), body=await async_maybe_transform( { "action": action, @@ -1301,7 +1344,12 @@ async def get( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/gpu_virtual/clusters/flavors.py b/src/gcore/resources/cloud/gpu_virtual/clusters/flavors.py index ee6fd7dc..d946af95 100644 --- a/src/gcore/resources/cloud/gpu_virtual/clusters/flavors.py +++ b/src/gcore/resources/cloud/gpu_virtual/clusters/flavors.py @@ -5,7 +5,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -80,7 +80,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/flavors", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/flavors", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -157,7 +159,9 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/flavors", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/flavors", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/cloud/gpu_virtual/clusters/images.py b/src/gcore/resources/cloud/gpu_virtual/clusters/images.py index b48be175..f68f2526 100644 --- a/src/gcore/resources/cloud/gpu_virtual/clusters/images.py +++ b/src/gcore/resources/cloud/gpu_virtual/clusters/images.py @@ -8,7 +8,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -81,7 +81,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/images", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/images", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -126,7 +128,12 @@ def delete( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return self._delete( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/images/{image_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/images/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -171,7 +178,12 @@ def get( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/images/{image_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/images/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -247,7 +259,9 @@ def upload( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/images", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/images", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "name": name, @@ -325,7 +339,9 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/images", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/images", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -370,7 +386,12 @@ async def delete( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return await self._delete( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/images/{image_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/images/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -415,7 +436,12 @@ async def get( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return await self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/images/{image_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/images/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -491,7 +517,9 @@ async def upload( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/images", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/images", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "name": name, diff --git a/src/gcore/resources/cloud/gpu_virtual/clusters/interfaces.py b/src/gcore/resources/cloud/gpu_virtual/clusters/interfaces.py index 28bae5d4..8478ecf6 100644 --- a/src/gcore/resources/cloud/gpu_virtual/clusters/interfaces.py +++ b/src/gcore/resources/cloud/gpu_virtual/clusters/interfaces.py @@ -5,6 +5,7 @@ import httpx from ....._types import Body, Query, Headers, NotGiven, not_given +from ....._utils import path_template from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -77,7 +78,12 @@ def list( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/interfaces", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/interfaces", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -143,7 +149,12 @@ async def list( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/interfaces", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/interfaces", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/gpu_virtual/clusters/servers.py b/src/gcore/resources/cloud/gpu_virtual/clusters/servers.py index 4895fd83..08683b79 100644 --- a/src/gcore/resources/cloud/gpu_virtual/clusters/servers.py +++ b/src/gcore/resources/cloud/gpu_virtual/clusters/servers.py @@ -9,7 +9,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -133,7 +133,12 @@ def list( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/servers", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/servers", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -220,7 +225,13 @@ def delete( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return self._delete( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/servers/{server_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/servers/{server_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + server_id=server_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -349,7 +360,12 @@ async def list( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/servers", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/servers", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -436,7 +452,13 @@ async def delete( if not server_id: raise ValueError(f"Expected a non-empty value for `server_id` but received {server_id!r}") return await self._delete( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/servers/{server_id}", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/servers/{server_id}", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + server_id=server_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/cloud/gpu_virtual/clusters/volumes.py b/src/gcore/resources/cloud/gpu_virtual/clusters/volumes.py index afa07662..49bc8f80 100644 --- a/src/gcore/resources/cloud/gpu_virtual/clusters/volumes.py +++ b/src/gcore/resources/cloud/gpu_virtual/clusters/volumes.py @@ -5,6 +5,7 @@ import httpx from ....._types import Body, Query, Headers, NotGiven, not_given +from ....._utils import path_template from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -77,7 +78,12 @@ def list( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/volumes", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/volumes", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -143,7 +149,12 @@ async def list( if not cluster_id: raise ValueError(f"Expected a non-empty value for `cluster_id` but received {cluster_id!r}") return await self._get( - f"/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/volumes", + path_template( + "/cloud/v3/gpu/virtual/{project_id}/{region_id}/clusters/{cluster_id}/volumes", + project_id=project_id, + region_id=region_id, + cluster_id=cluster_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/inference/api_keys.py b/src/gcore/resources/cloud/inference/api_keys.py index 37e51cd0..9d0f98b4 100644 --- a/src/gcore/resources/cloud/inference/api_keys.py +++ b/src/gcore/resources/cloud/inference/api_keys.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -84,7 +84,7 @@ def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._post( - f"/cloud/v3/inference/{project_id}/api_keys", + path_template("/cloud/v3/inference/{project_id}/api_keys", project_id=project_id), body=maybe_transform( { "name": name, @@ -135,7 +135,11 @@ def update( if not api_key_name: raise ValueError(f"Expected a non-empty value for `api_key_name` but received {api_key_name!r}") return self._patch( - f"/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + path_template( + "/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + project_id=project_id, + api_key_name=api_key_name, + ), body=maybe_transform({"description": description}, api_key_update_params.APIKeyUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -178,7 +182,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get_api_list( - f"/cloud/v3/inference/{project_id}/api_keys", + path_template("/cloud/v3/inference/{project_id}/api_keys", project_id=project_id), page=SyncOffsetPage[InferenceAPIKey], options=make_request_options( extra_headers=extra_headers, @@ -233,7 +237,11 @@ def delete( raise ValueError(f"Expected a non-empty value for `api_key_name` but received {api_key_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + path_template( + "/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + project_id=project_id, + api_key_name=api_key_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -273,7 +281,11 @@ def get( if not api_key_name: raise ValueError(f"Expected a non-empty value for `api_key_name` but received {api_key_name!r}") return self._get( - f"/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + path_template( + "/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + project_id=project_id, + api_key_name=api_key_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -340,7 +352,7 @@ async def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return await self._post( - f"/cloud/v3/inference/{project_id}/api_keys", + path_template("/cloud/v3/inference/{project_id}/api_keys", project_id=project_id), body=await async_maybe_transform( { "name": name, @@ -391,7 +403,11 @@ async def update( if not api_key_name: raise ValueError(f"Expected a non-empty value for `api_key_name` but received {api_key_name!r}") return await self._patch( - f"/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + path_template( + "/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + project_id=project_id, + api_key_name=api_key_name, + ), body=await async_maybe_transform({"description": description}, api_key_update_params.APIKeyUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -434,7 +450,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get_api_list( - f"/cloud/v3/inference/{project_id}/api_keys", + path_template("/cloud/v3/inference/{project_id}/api_keys", project_id=project_id), page=AsyncOffsetPage[InferenceAPIKey], options=make_request_options( extra_headers=extra_headers, @@ -489,7 +505,11 @@ async def delete( raise ValueError(f"Expected a non-empty value for `api_key_name` but received {api_key_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + path_template( + "/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + project_id=project_id, + api_key_name=api_key_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -529,7 +549,11 @@ async def get( if not api_key_name: raise ValueError(f"Expected a non-empty value for `api_key_name` but received {api_key_name!r}") return await self._get( - f"/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + path_template( + "/cloud/v3/inference/{project_id}/api_keys/{api_key_name}", + project_id=project_id, + api_key_name=api_key_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/inference/applications/deployments.py b/src/gcore/resources/cloud/inference/applications/deployments.py index 5bfac7b7..351c8230 100644 --- a/src/gcore/resources/cloud/inference/applications/deployments.py +++ b/src/gcore/resources/cloud/inference/applications/deployments.py @@ -7,7 +7,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -93,7 +93,7 @@ def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._post( - f"/cloud/v3/inference/applications/{project_id}/deployments", + path_template("/cloud/v3/inference/applications/{project_id}/deployments", project_id=project_id), body=maybe_transform( { "application_name": application_name, @@ -156,7 +156,11 @@ def update( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return self._patch( - f"/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), body=maybe_transform( { "api_keys": api_keys, @@ -201,7 +205,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get( - f"/cloud/v3/inference/applications/{project_id}/deployments", + path_template("/cloud/v3/inference/applications/{project_id}/deployments", project_id=project_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -243,7 +247,11 @@ def delete( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return self._delete( - f"/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -287,7 +295,11 @@ def get( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return self._get( - f"/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -361,7 +373,7 @@ async def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return await self._post( - f"/cloud/v3/inference/applications/{project_id}/deployments", + path_template("/cloud/v3/inference/applications/{project_id}/deployments", project_id=project_id), body=await async_maybe_transform( { "application_name": application_name, @@ -424,7 +436,11 @@ async def update( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return await self._patch( - f"/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), body=await async_maybe_transform( { "api_keys": api_keys, @@ -469,7 +485,7 @@ async def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return await self._get( - f"/cloud/v3/inference/applications/{project_id}/deployments", + path_template("/cloud/v3/inference/applications/{project_id}/deployments", project_id=project_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -511,7 +527,11 @@ async def delete( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return await self._delete( - f"/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -555,7 +575,11 @@ async def get( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return await self._get( - f"/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/applications/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/inference/applications/templates.py b/src/gcore/resources/cloud/inference/applications/templates.py index d888a399..b63f3260 100644 --- a/src/gcore/resources/cloud/inference/applications/templates.py +++ b/src/gcore/resources/cloud/inference/applications/templates.py @@ -5,6 +5,7 @@ import httpx from ....._types import Body, Query, Headers, NotGiven, not_given +from ....._utils import path_template from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -97,7 +98,9 @@ def get( if not application_name: raise ValueError(f"Expected a non-empty value for `application_name` but received {application_name!r}") return self._get( - f"/cloud/v3/inference/applications/catalog/{application_name}", + path_template( + "/cloud/v3/inference/applications/catalog/{application_name}", application_name=application_name + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -182,7 +185,9 @@ async def get( if not application_name: raise ValueError(f"Expected a non-empty value for `application_name` but received {application_name!r}") return await self._get( - f"/cloud/v3/inference/applications/catalog/{application_name}", + path_template( + "/cloud/v3/inference/applications/catalog/{application_name}", application_name=application_name + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/inference/deployments/deployments.py b/src/gcore/resources/cloud/inference/deployments/deployments.py index 9a32daf3..cd0bafa7 100644 --- a/src/gcore/resources/cloud/inference/deployments/deployments.py +++ b/src/gcore/resources/cloud/inference/deployments/deployments.py @@ -16,7 +16,7 @@ AsyncLogsResourceWithStreamingResponse, ) from ....._types import NOT_GIVEN, Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -151,7 +151,7 @@ def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._post( - f"/cloud/v3/inference/{project_id}/deployments", + path_template("/cloud/v3/inference/{project_id}/deployments", project_id=project_id), body=maybe_transform( { "containers": containers, @@ -267,7 +267,11 @@ def update( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return self._patch( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), body=maybe_transform( { "api_keys": api_keys, @@ -329,7 +333,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get_api_list( - f"/cloud/v3/inference/{project_id}/deployments", + path_template("/cloud/v3/inference/{project_id}/deployments", project_id=project_id), page=SyncOffsetPage[InferenceDeployment], options=make_request_options( extra_headers=extra_headers, @@ -380,7 +384,11 @@ def delete( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return self._delete( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -420,7 +428,11 @@ def get( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return self._get( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -461,7 +473,11 @@ def get_api_key( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return self._get( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}/apikey", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}/apikey", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -509,7 +525,11 @@ def start( raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}/start", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}/start", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -557,7 +577,11 @@ def stop( raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}/stop", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}/stop", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -854,7 +878,7 @@ async def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return await self._post( - f"/cloud/v3/inference/{project_id}/deployments", + path_template("/cloud/v3/inference/{project_id}/deployments", project_id=project_id), body=await async_maybe_transform( { "containers": containers, @@ -970,7 +994,11 @@ async def update( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return await self._patch( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), body=await async_maybe_transform( { "api_keys": api_keys, @@ -1032,7 +1060,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get_api_list( - f"/cloud/v3/inference/{project_id}/deployments", + path_template("/cloud/v3/inference/{project_id}/deployments", project_id=project_id), page=AsyncOffsetPage[InferenceDeployment], options=make_request_options( extra_headers=extra_headers, @@ -1083,7 +1111,11 @@ async def delete( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return await self._delete( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1123,7 +1155,11 @@ async def get( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return await self._get( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1164,7 +1200,11 @@ async def get_api_key( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return await self._get( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}/apikey", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}/apikey", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1212,7 +1252,11 @@ async def start( raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}/start", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}/start", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1260,7 +1304,11 @@ async def stop( raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}/stop", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}/stop", + project_id=project_id, + deployment_name=deployment_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/inference/deployments/logs.py b/src/gcore/resources/cloud/inference/deployments/logs.py index 3a46cbd0..583b9a90 100644 --- a/src/gcore/resources/cloud/inference/deployments/logs.py +++ b/src/gcore/resources/cloud/inference/deployments/logs.py @@ -8,7 +8,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform +from ....._utils import path_template, maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -91,7 +91,11 @@ def list( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return self._get_api_list( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}/logs", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}/logs", + project_id=project_id, + deployment_name=deployment_name, + ), page=SyncOffsetPage[InferenceDeploymentLog], options=make_request_options( extra_headers=extra_headers, @@ -178,7 +182,11 @@ def list( if not deployment_name: raise ValueError(f"Expected a non-empty value for `deployment_name` but received {deployment_name!r}") return self._get_api_list( - f"/cloud/v3/inference/{project_id}/deployments/{deployment_name}/logs", + path_template( + "/cloud/v3/inference/{project_id}/deployments/{deployment_name}/logs", + project_id=project_id, + deployment_name=deployment_name, + ), page=AsyncOffsetPage[InferenceDeploymentLog], options=make_request_options( extra_headers=extra_headers, diff --git a/src/gcore/resources/cloud/inference/flavors.py b/src/gcore/resources/cloud/inference/flavors.py index c9934320..68085666 100644 --- a/src/gcore/resources/cloud/inference/flavors.py +++ b/src/gcore/resources/cloud/inference/flavors.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform +from ...._utils import path_template, maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -119,7 +119,7 @@ def get( if not flavor_name: raise ValueError(f"Expected a non-empty value for `flavor_name` but received {flavor_name!r}") return self._get( - f"/cloud/v3/inference/flavors/{flavor_name}", + path_template("/cloud/v3/inference/flavors/{flavor_name}", flavor_name=flavor_name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -224,7 +224,7 @@ async def get( if not flavor_name: raise ValueError(f"Expected a non-empty value for `flavor_name` but received {flavor_name!r}") return await self._get( - f"/cloud/v3/inference/flavors/{flavor_name}", + path_template("/cloud/v3/inference/flavors/{flavor_name}", flavor_name=flavor_name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/inference/registry_credentials.py b/src/gcore/resources/cloud/inference/registry_credentials.py index 46cee6d2..b630c9c1 100644 --- a/src/gcore/resources/cloud/inference/registry_credentials.py +++ b/src/gcore/resources/cloud/inference/registry_credentials.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -90,7 +90,7 @@ def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._post( - f"/cloud/v3/inference/{project_id}/registry_credentials", + path_template("/cloud/v3/inference/{project_id}/registry_credentials", project_id=project_id), body=maybe_transform( { "name": name, @@ -141,7 +141,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get_api_list( - f"/cloud/v3/inference/{project_id}/registry_credentials", + path_template("/cloud/v3/inference/{project_id}/registry_credentials", project_id=project_id), page=SyncOffsetPage[InferenceRegistryCredentials], options=make_request_options( extra_headers=extra_headers, @@ -193,7 +193,11 @@ def delete( raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + path_template( + "/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + project_id=project_id, + credential_name=credential_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -233,7 +237,11 @@ def get( if not credential_name: raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}") return self._get( - f"/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + path_template( + "/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + project_id=project_id, + credential_name=credential_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -282,7 +290,11 @@ def replace( if not credential_name: raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}") return self._put( - f"/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + path_template( + "/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + project_id=project_id, + credential_name=credential_name, + ), body=maybe_transform( { "password": password, @@ -362,7 +374,7 @@ async def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return await self._post( - f"/cloud/v3/inference/{project_id}/registry_credentials", + path_template("/cloud/v3/inference/{project_id}/registry_credentials", project_id=project_id), body=await async_maybe_transform( { "name": name, @@ -413,7 +425,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get_api_list( - f"/cloud/v3/inference/{project_id}/registry_credentials", + path_template("/cloud/v3/inference/{project_id}/registry_credentials", project_id=project_id), page=AsyncOffsetPage[InferenceRegistryCredentials], options=make_request_options( extra_headers=extra_headers, @@ -465,7 +477,11 @@ async def delete( raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + path_template( + "/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + project_id=project_id, + credential_name=credential_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -505,7 +521,11 @@ async def get( if not credential_name: raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}") return await self._get( - f"/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + path_template( + "/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + project_id=project_id, + credential_name=credential_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -554,7 +574,11 @@ async def replace( if not credential_name: raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}") return await self._put( - f"/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + path_template( + "/cloud/v3/inference/{project_id}/registry_credentials/{credential_name}", + project_id=project_id, + credential_name=credential_name, + ), body=await async_maybe_transform( { "password": password, diff --git a/src/gcore/resources/cloud/inference/secrets.py b/src/gcore/resources/cloud/inference/secrets.py index 7d51418e..c041b1bb 100644 --- a/src/gcore/resources/cloud/inference/secrets.py +++ b/src/gcore/resources/cloud/inference/secrets.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -83,7 +83,7 @@ def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._post( - f"/cloud/v3/inference/{project_id}/secrets", + path_template("/cloud/v3/inference/{project_id}/secrets", project_id=project_id), body=maybe_transform( { "data": data, @@ -134,7 +134,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get_api_list( - f"/cloud/v3/inference/{project_id}/secrets", + path_template("/cloud/v3/inference/{project_id}/secrets", project_id=project_id), page=SyncOffsetPage[InferenceSecret], options=make_request_options( extra_headers=extra_headers, @@ -186,7 +186,9 @@ def delete( raise ValueError(f"Expected a non-empty value for `secret_name` but received {secret_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v3/inference/{project_id}/secrets/{secret_name}", + path_template( + "/cloud/v3/inference/{project_id}/secrets/{secret_name}", project_id=project_id, secret_name=secret_name + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -226,7 +228,9 @@ def get( if not secret_name: raise ValueError(f"Expected a non-empty value for `secret_name` but received {secret_name!r}") return self._get( - f"/cloud/v3/inference/{project_id}/secrets/{secret_name}", + path_template( + "/cloud/v3/inference/{project_id}/secrets/{secret_name}", project_id=project_id, secret_name=secret_name + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -272,7 +276,9 @@ def replace( if not secret_name: raise ValueError(f"Expected a non-empty value for `secret_name` but received {secret_name!r}") return self._put( - f"/cloud/v3/inference/{project_id}/secrets/{secret_name}", + path_template( + "/cloud/v3/inference/{project_id}/secrets/{secret_name}", project_id=project_id, secret_name=secret_name + ), body=maybe_transform( { "data": data, @@ -348,7 +354,7 @@ async def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return await self._post( - f"/cloud/v3/inference/{project_id}/secrets", + path_template("/cloud/v3/inference/{project_id}/secrets", project_id=project_id), body=await async_maybe_transform( { "data": data, @@ -399,7 +405,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get_api_list( - f"/cloud/v3/inference/{project_id}/secrets", + path_template("/cloud/v3/inference/{project_id}/secrets", project_id=project_id), page=AsyncOffsetPage[InferenceSecret], options=make_request_options( extra_headers=extra_headers, @@ -451,7 +457,9 @@ async def delete( raise ValueError(f"Expected a non-empty value for `secret_name` but received {secret_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v3/inference/{project_id}/secrets/{secret_name}", + path_template( + "/cloud/v3/inference/{project_id}/secrets/{secret_name}", project_id=project_id, secret_name=secret_name + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -491,7 +499,9 @@ async def get( if not secret_name: raise ValueError(f"Expected a non-empty value for `secret_name` but received {secret_name!r}") return await self._get( - f"/cloud/v3/inference/{project_id}/secrets/{secret_name}", + path_template( + "/cloud/v3/inference/{project_id}/secrets/{secret_name}", project_id=project_id, secret_name=secret_name + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -537,7 +547,9 @@ async def replace( if not secret_name: raise ValueError(f"Expected a non-empty value for `secret_name` but received {secret_name!r}") return await self._put( - f"/cloud/v3/inference/{project_id}/secrets/{secret_name}", + path_template( + "/cloud/v3/inference/{project_id}/secrets/{secret_name}", project_id=project_id, secret_name=secret_name + ), body=await async_maybe_transform( { "data": data, diff --git a/src/gcore/resources/cloud/instances/flavors.py b/src/gcore/resources/cloud/instances/flavors.py index 3263eef3..2765ba51 100644 --- a/src/gcore/resources/cloud/instances/flavors.py +++ b/src/gcore/resources/cloud/instances/flavors.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -89,7 +89,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/flavors/{project_id}/{region_id}", + path_template("/cloud/v1/flavors/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -177,7 +177,7 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/flavors/{project_id}/{region_id}", + path_template("/cloud/v1/flavors/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/cloud/instances/images.py b/src/gcore/resources/cloud/instances/images.py index c1cd30cb..6599d48b 100644 --- a/src/gcore/resources/cloud/instances/images.py +++ b/src/gcore/resources/cloud/instances/images.py @@ -8,7 +8,7 @@ import httpx from ...._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -115,7 +115,12 @@ def update( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return self._patch( - f"/cloud/v1/images/{project_id}/{region_id}/{image_id}", + path_template( + "/cloud/v1/images/{project_id}/{region_id}/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), body=maybe_transform( { "hw_firmware_type": hw_firmware_type, @@ -181,7 +186,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/images/{project_id}/{region_id}", + path_template("/cloud/v1/images/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -235,7 +240,12 @@ def delete( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return self._delete( - f"/cloud/v1/images/{project_id}/{region_id}/{image_id}", + path_template( + "/cloud/v1/images/{project_id}/{region_id}/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -344,7 +354,7 @@ def create_from_volume( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/images/{project_id}/{region_id}", + path_template("/cloud/v1/images/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "name": name, @@ -463,7 +473,12 @@ def get( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return self._get( - f"/cloud/v1/images/{project_id}/{region_id}/{image_id}", + path_template( + "/cloud/v1/images/{project_id}/{region_id}/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -547,7 +562,9 @@ def upload( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/downloadimage/{project_id}/{region_id}", + path_template( + "/cloud/v1/downloadimage/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "name": name, @@ -720,7 +737,12 @@ async def update( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return await self._patch( - f"/cloud/v1/images/{project_id}/{region_id}/{image_id}", + path_template( + "/cloud/v1/images/{project_id}/{region_id}/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), body=await async_maybe_transform( { "hw_firmware_type": hw_firmware_type, @@ -786,7 +808,7 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/images/{project_id}/{region_id}", + path_template("/cloud/v1/images/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -840,7 +862,12 @@ async def delete( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return await self._delete( - f"/cloud/v1/images/{project_id}/{region_id}/{image_id}", + path_template( + "/cloud/v1/images/{project_id}/{region_id}/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -949,7 +976,7 @@ async def create_from_volume( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/images/{project_id}/{region_id}", + path_template("/cloud/v1/images/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "name": name, @@ -1068,7 +1095,12 @@ async def get( if not image_id: raise ValueError(f"Expected a non-empty value for `image_id` but received {image_id!r}") return await self._get( - f"/cloud/v1/images/{project_id}/{region_id}/{image_id}", + path_template( + "/cloud/v1/images/{project_id}/{region_id}/{image_id}", + project_id=project_id, + region_id=region_id, + image_id=image_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1152,7 +1184,9 @@ async def upload( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/downloadimage/{project_id}/{region_id}", + path_template( + "/cloud/v1/downloadimage/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "name": name, diff --git a/src/gcore/resources/cloud/instances/instances.py b/src/gcore/resources/cloud/instances/instances.py index 73fcef9b..2840d9d4 100644 --- a/src/gcore/resources/cloud/instances/instances.py +++ b/src/gcore/resources/cloud/instances/instances.py @@ -33,7 +33,7 @@ AsyncMetricsResourceWithStreamingResponse, ) from ...._types import NOT_GIVEN, Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import required_args, maybe_transform, async_maybe_transform +from ...._utils import path_template, required_args, maybe_transform, async_maybe_transform from ...._compat import cached_property from .interfaces import ( InterfacesResource, @@ -247,7 +247,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v2/instances/{project_id}/{region_id}", + path_template("/cloud/v2/instances/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "flavor": flavor, @@ -409,7 +409,12 @@ def update( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._patch( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform( { "name": name, @@ -565,7 +570,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/instances/{project_id}/{region_id}", + path_template("/cloud/v1/instances/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=SyncOffsetPage[Instance], options=make_request_options( extra_headers=extra_headers, @@ -659,7 +664,12 @@ def delete( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._delete( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -812,7 +822,12 @@ def action( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v2/instances/{project_id}/{region_id}/{instance_id}/action", + path_template( + "/cloud/v2/instances/{project_id}/{region_id}/{instance_id}/action", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform( { "action": action, @@ -982,7 +997,12 @@ def add_to_placement_group( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/put_into_servergroup", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/put_into_servergroup", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform( {"servergroup_id": servergroup_id}, instance_add_to_placement_group_params.InstanceAddToPlacementGroupParams, @@ -1079,7 +1099,12 @@ def assign_security_group( raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/addsecuritygroup", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/addsecuritygroup", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform( { "name": name, @@ -1125,7 +1150,12 @@ def disable_port_security( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return self._post( - f"/cloud/v1/ports/{project_id}/{region_id}/{port_id}/disable_port_security", + path_template( + "/cloud/v1/ports/{project_id}/{region_id}/{port_id}/disable_port_security", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1164,7 +1194,12 @@ def enable_port_security( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return self._post( - f"/cloud/v1/ports/{project_id}/{region_id}/{port_id}/enable_port_security", + path_template( + "/cloud/v1/ports/{project_id}/{region_id}/{port_id}/enable_port_security", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1220,7 +1255,12 @@ def get( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._get( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1262,7 +1302,12 @@ def get_console( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._get( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/get_console", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/get_console", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1309,7 +1354,12 @@ def remove_from_placement_group( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/remove_from_servergroup", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/remove_from_servergroup", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1393,7 +1443,12 @@ def resize( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/changeflavor", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/changeflavor", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform({"flavor_id": flavor_id}, instance_resize_params.InstanceResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -1487,7 +1542,12 @@ def unassign_security_group( raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/delsecuritygroup", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/delsecuritygroup", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform( { "name": name, @@ -1676,7 +1736,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v2/instances/{project_id}/{region_id}", + path_template("/cloud/v2/instances/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "flavor": flavor, @@ -1838,7 +1898,12 @@ async def update( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._patch( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform( { "name": name, @@ -1994,7 +2059,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/instances/{project_id}/{region_id}", + path_template("/cloud/v1/instances/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=AsyncOffsetPage[Instance], options=make_request_options( extra_headers=extra_headers, @@ -2088,7 +2153,12 @@ async def delete( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._delete( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -2241,7 +2311,12 @@ async def action( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v2/instances/{project_id}/{region_id}/{instance_id}/action", + path_template( + "/cloud/v2/instances/{project_id}/{region_id}/{instance_id}/action", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform( { "action": action, @@ -2411,7 +2486,12 @@ async def add_to_placement_group( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/put_into_servergroup", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/put_into_servergroup", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform( {"servergroup_id": servergroup_id}, instance_add_to_placement_group_params.InstanceAddToPlacementGroupParams, @@ -2508,7 +2588,12 @@ async def assign_security_group( raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/addsecuritygroup", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/addsecuritygroup", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform( { "name": name, @@ -2554,7 +2639,12 @@ async def disable_port_security( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return await self._post( - f"/cloud/v1/ports/{project_id}/{region_id}/{port_id}/disable_port_security", + path_template( + "/cloud/v1/ports/{project_id}/{region_id}/{port_id}/disable_port_security", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -2593,7 +2683,12 @@ async def enable_port_security( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return await self._post( - f"/cloud/v1/ports/{project_id}/{region_id}/{port_id}/enable_port_security", + path_template( + "/cloud/v1/ports/{project_id}/{region_id}/{port_id}/enable_port_security", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -2649,7 +2744,12 @@ async def get( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._get( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -2691,7 +2791,12 @@ async def get_console( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._get( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/get_console", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/get_console", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -2738,7 +2843,12 @@ async def remove_from_placement_group( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/remove_from_servergroup", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/remove_from_servergroup", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -2822,7 +2932,12 @@ async def resize( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/changeflavor", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/changeflavor", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform({"flavor_id": flavor_id}, instance_resize_params.InstanceResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -2916,7 +3031,12 @@ async def unassign_security_group( raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/delsecuritygroup", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/delsecuritygroup", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform( { "name": name, diff --git a/src/gcore/resources/cloud/instances/interfaces.py b/src/gcore/resources/cloud/instances/interfaces.py index b42a1daf..f847f9fd 100644 --- a/src/gcore/resources/cloud/instances/interfaces.py +++ b/src/gcore/resources/cloud/instances/interfaces.py @@ -8,7 +8,7 @@ import httpx from ...._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -77,7 +77,12 @@ def list( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._get( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/interfaces", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/interfaces", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -309,7 +314,12 @@ def attach( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/attach_interface", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/attach_interface", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform( { "ddos_profile": ddos_profile, @@ -665,7 +675,12 @@ def detach( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/detach_interface", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/detach_interface", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform( { "ip_address": ip_address, @@ -732,7 +747,12 @@ async def list( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._get( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/interfaces", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/interfaces", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -964,7 +984,12 @@ async def attach( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/attach_interface", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/attach_interface", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform( { "ddos_profile": ddos_profile, @@ -1246,7 +1271,12 @@ async def detach( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/detach_interface", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/detach_interface", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform( { "ip_address": ip_address, diff --git a/src/gcore/resources/cloud/instances/metrics.py b/src/gcore/resources/cloud/instances/metrics.py index c24b208c..e56465a9 100644 --- a/src/gcore/resources/cloud/instances/metrics.py +++ b/src/gcore/resources/cloud/instances/metrics.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Query, Headers, NotGiven, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -87,7 +87,12 @@ def list( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/metrics", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/metrics", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=maybe_transform( { "time_interval": time_interval, @@ -166,7 +171,12 @@ async def list( if not instance_id: raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") return await self._post( - f"/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/metrics", + path_template( + "/cloud/v1/instances/{project_id}/{region_id}/{instance_id}/metrics", + project_id=project_id, + region_id=region_id, + instance_id=instance_id, + ), body=await async_maybe_transform( { "time_interval": time_interval, diff --git a/src/gcore/resources/cloud/k8s/clusters/clusters.py b/src/gcore/resources/cloud/k8s/clusters/clusters.py index b2875da5..d7951329 100644 --- a/src/gcore/resources/cloud/k8s/clusters/clusters.py +++ b/src/gcore/resources/cloud/k8s/clusters/clusters.py @@ -15,7 +15,7 @@ AsyncNodesResourceWithStreamingResponse, ) from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from .kubeconfig import ( KubeconfigResource, AsyncKubeconfigResource, @@ -238,7 +238,9 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "keypair": keypair, @@ -380,7 +382,12 @@ def update( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._patch( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), body=maybe_transform( { "add_ons": add_ons, @@ -431,7 +438,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -479,7 +488,12 @@ def delete( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._delete( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -528,7 +542,12 @@ def get( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -573,7 +592,12 @@ def get_certificate( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/certificates", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/certificates", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -618,7 +642,12 @@ def list_versions_for_upgrade( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/upgrade_versions", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/upgrade_versions", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -666,7 +695,12 @@ def upgrade( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._post( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/upgrade", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/upgrade", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), body=maybe_transform({"version": version}, cluster_upgrade_params.ClusterUpgradeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -857,7 +891,9 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "keypair": keypair, @@ -999,7 +1035,12 @@ async def update( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._patch( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), body=await async_maybe_transform( { "add_ons": add_ons, @@ -1050,7 +1091,9 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1098,7 +1141,12 @@ async def delete( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._delete( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1147,7 +1195,12 @@ async def get( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1192,7 +1245,12 @@ async def get_certificate( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/certificates", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/certificates", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1237,7 +1295,12 @@ async def list_versions_for_upgrade( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/upgrade_versions", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/upgrade_versions", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1285,7 +1348,12 @@ async def upgrade( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._post( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/upgrade", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/upgrade", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), body=await async_maybe_transform({"version": version}, cluster_upgrade_params.ClusterUpgradeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gcore/resources/cloud/k8s/clusters/kubeconfig.py b/src/gcore/resources/cloud/k8s/clusters/kubeconfig.py index d9787fc1..8e1c86e9 100644 --- a/src/gcore/resources/cloud/k8s/clusters/kubeconfig.py +++ b/src/gcore/resources/cloud/k8s/clusters/kubeconfig.py @@ -5,6 +5,7 @@ import httpx from ....._types import Body, Query, Headers, NotGiven, not_given +from ....._utils import path_template from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -81,7 +82,12 @@ def get( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/config", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/config", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -151,7 +157,12 @@ async def get( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/config", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/config", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/k8s/clusters/nodes.py b/src/gcore/resources/cloud/k8s/clusters/nodes.py index 482ece84..db438920 100644 --- a/src/gcore/resources/cloud/k8s/clusters/nodes.py +++ b/src/gcore/resources/cloud/k8s/clusters/nodes.py @@ -5,7 +5,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -82,7 +82,12 @@ def list( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/instances", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/instances", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -138,7 +143,13 @@ def delete( raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/instances/{instance_id}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/instances/{instance_id}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -207,7 +218,12 @@ async def list( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/instances", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/instances", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -263,7 +279,13 @@ async def delete( raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/instances/{instance_id}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/instances/{instance_id}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/k8s/clusters/pools/nodes.py b/src/gcore/resources/cloud/k8s/clusters/pools/nodes.py index 5d360e78..22d80d44 100644 --- a/src/gcore/resources/cloud/k8s/clusters/pools/nodes.py +++ b/src/gcore/resources/cloud/k8s/clusters/pools/nodes.py @@ -5,7 +5,7 @@ import httpx from ......_types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ......_utils import maybe_transform, async_maybe_transform +from ......_utils import path_template, maybe_transform, async_maybe_transform from ......_compat import cached_property from ......_resource import SyncAPIResource, AsyncAPIResource from ......_response import ( @@ -87,7 +87,13 @@ def list( if not pool_name: raise ValueError(f"Expected a non-empty value for `pool_name` but received {pool_name!r}") return self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/instances", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/instances", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -148,7 +154,14 @@ def delete( raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/instances/{instance_id}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/instances/{instance_id}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -222,7 +235,13 @@ async def list( if not pool_name: raise ValueError(f"Expected a non-empty value for `pool_name` but received {pool_name!r}") return await self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/instances", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/instances", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -283,7 +302,14 @@ async def delete( raise ValueError(f"Expected a non-empty value for `instance_id` but received {instance_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/instances/{instance_id}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/instances/{instance_id}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + instance_id=instance_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/k8s/clusters/pools/pools.py b/src/gcore/resources/cloud/k8s/clusters/pools/pools.py index d23019c4..b261fe97 100644 --- a/src/gcore/resources/cloud/k8s/clusters/pools/pools.py +++ b/src/gcore/resources/cloud/k8s/clusters/pools/pools.py @@ -16,7 +16,7 @@ AsyncNodesResourceWithStreamingResponse, ) from ......_types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ......_utils import maybe_transform, async_maybe_transform +from ......_utils import path_template, maybe_transform, async_maybe_transform from ......_compat import cached_property from ......_resource import SyncAPIResource, AsyncAPIResource from ......_response import ( @@ -142,7 +142,12 @@ def create( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._post( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), body=maybe_transform( { "flavor_id": flavor_id, @@ -228,7 +233,13 @@ def update( if not pool_name: raise ValueError(f"Expected a non-empty value for `pool_name` but received {pool_name!r}") return self._patch( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + ), body=maybe_transform( { "auto_healing_enabled": auto_healing_enabled, @@ -284,7 +295,12 @@ def list( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -334,7 +350,13 @@ def delete( if not pool_name: raise ValueError(f"Expected a non-empty value for `pool_name` but received {pool_name!r}") return self._delete( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -399,7 +421,11 @@ def check_quota( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/pools/check_limits", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/pools/check_limits", + project_id=project_id, + region_id=region_id, + ), body=maybe_transform( { "flavor_id": flavor_id, @@ -461,7 +487,13 @@ def get( if not pool_name: raise ValueError(f"Expected a non-empty value for `pool_name` but received {pool_name!r}") return self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -514,7 +546,13 @@ def resize( if not pool_name: raise ValueError(f"Expected a non-empty value for `pool_name` but received {pool_name!r}") return self._post( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/resize", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/resize", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + ), body=maybe_transform({"node_count": node_count}, pool_resize_params.PoolResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -625,7 +663,12 @@ async def create( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._post( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), body=await async_maybe_transform( { "flavor_id": flavor_id, @@ -711,7 +754,13 @@ async def update( if not pool_name: raise ValueError(f"Expected a non-empty value for `pool_name` but received {pool_name!r}") return await self._patch( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + ), body=await async_maybe_transform( { "auto_healing_enabled": auto_healing_enabled, @@ -767,7 +816,12 @@ async def list( if not cluster_name: raise ValueError(f"Expected a non-empty value for `cluster_name` but received {cluster_name!r}") return await self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -817,7 +871,13 @@ async def delete( if not pool_name: raise ValueError(f"Expected a non-empty value for `pool_name` but received {pool_name!r}") return await self._delete( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -882,7 +942,11 @@ async def check_quota( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/pools/check_limits", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/pools/check_limits", + project_id=project_id, + region_id=region_id, + ), body=await async_maybe_transform( { "flavor_id": flavor_id, @@ -944,7 +1008,13 @@ async def get( if not pool_name: raise ValueError(f"Expected a non-empty value for `pool_name` but received {pool_name!r}") return await self._get( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -997,7 +1067,13 @@ async def resize( if not pool_name: raise ValueError(f"Expected a non-empty value for `pool_name` but received {pool_name!r}") return await self._post( - f"/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/resize", + path_template( + "/cloud/v2/k8s/clusters/{project_id}/{region_id}/{cluster_name}/pools/{pool_name}/resize", + project_id=project_id, + region_id=region_id, + cluster_name=cluster_name, + pool_name=pool_name, + ), body=await async_maybe_transform({"node_count": node_count}, pool_resize_params.PoolResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gcore/resources/cloud/k8s/flavors.py b/src/gcore/resources/cloud/k8s/flavors.py index 36f4fc54..359e6a57 100644 --- a/src/gcore/resources/cloud/k8s/flavors.py +++ b/src/gcore/resources/cloud/k8s/flavors.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -86,7 +86,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/k8s/{project_id}/{region_id}/flavors", + path_template("/cloud/v1/k8s/{project_id}/{region_id}/flavors", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -170,7 +170,7 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/k8s/{project_id}/{region_id}/flavors", + path_template("/cloud/v1/k8s/{project_id}/{region_id}/flavors", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/cloud/k8s/k8s.py b/src/gcore/resources/cloud/k8s/k8s.py index 8cbef33f..2d3b38a5 100644 --- a/src/gcore/resources/cloud/k8s/k8s.py +++ b/src/gcore/resources/cloud/k8s/k8s.py @@ -13,6 +13,7 @@ AsyncFlavorsResourceWithStreamingResponse, ) from ...._types import Body, Query, Headers, NotGiven, not_given +from ...._utils import path_template from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -99,7 +100,9 @@ def list_versions( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v2/k8s/{project_id}/{region_id}/create_versions", + path_template( + "/cloud/v2/k8s/{project_id}/{region_id}/create_versions", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -171,7 +174,9 @@ async def list_versions( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v2/k8s/{project_id}/{region_id}/create_versions", + path_template( + "/cloud/v2/k8s/{project_id}/{region_id}/create_versions", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/load_balancers/flavors.py b/src/gcore/resources/cloud/load_balancers/flavors.py index df4739a5..27e43c14 100644 --- a/src/gcore/resources/cloud/load_balancers/flavors.py +++ b/src/gcore/resources/cloud/load_balancers/flavors.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -80,7 +80,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/lbflavors/{project_id}/{region_id}", + path_template("/cloud/v1/lbflavors/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -151,7 +151,7 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/lbflavors/{project_id}/{region_id}", + path_template("/cloud/v1/lbflavors/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/cloud/load_balancers/l7_policies/l7_policies.py b/src/gcore/resources/cloud/load_balancers/l7_policies/l7_policies.py index 22c257d4..b9243fe3 100644 --- a/src/gcore/resources/cloud/load_balancers/l7_policies/l7_policies.py +++ b/src/gcore/resources/cloud/load_balancers/l7_policies/l7_policies.py @@ -15,7 +15,7 @@ AsyncRulesResourceWithStreamingResponse, ) from ....._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import required_args, maybe_transform, async_maybe_transform +from ....._utils import path_template, required_args, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -295,7 +295,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/l7policies/{project_id}/{region_id}", + path_template("/cloud/v1/l7policies/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "action": action, @@ -554,7 +554,12 @@ def update( if not l7policy_id: raise ValueError(f"Expected a non-empty value for `l7policy_id` but received {l7policy_id!r}") return self._patch( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + ), body=maybe_transform( { "action": action, @@ -607,7 +612,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/l7policies/{project_id}/{region_id}", + path_template("/cloud/v1/l7policies/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -652,7 +657,12 @@ def delete( if not l7policy_id: raise ValueError(f"Expected a non-empty value for `l7policy_id` but received {l7policy_id!r}") return self._delete( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -697,7 +707,12 @@ def get( if not l7policy_id: raise ValueError(f"Expected a non-empty value for `l7policy_id` but received {l7policy_id!r}") return self._get( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1309,7 +1324,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/l7policies/{project_id}/{region_id}", + path_template("/cloud/v1/l7policies/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "action": action, @@ -1568,7 +1583,12 @@ async def update( if not l7policy_id: raise ValueError(f"Expected a non-empty value for `l7policy_id` but received {l7policy_id!r}") return await self._patch( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + ), body=await async_maybe_transform( { "action": action, @@ -1621,7 +1641,7 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/l7policies/{project_id}/{region_id}", + path_template("/cloud/v1/l7policies/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1666,7 +1686,12 @@ async def delete( if not l7policy_id: raise ValueError(f"Expected a non-empty value for `l7policy_id` but received {l7policy_id!r}") return await self._delete( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1711,7 +1736,12 @@ async def get( if not l7policy_id: raise ValueError(f"Expected a non-empty value for `l7policy_id` but received {l7policy_id!r}") return await self._get( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/load_balancers/l7_policies/rules.py b/src/gcore/resources/cloud/load_balancers/l7_policies/rules.py index 822c28c5..901baf03 100644 --- a/src/gcore/resources/cloud/load_balancers/l7_policies/rules.py +++ b/src/gcore/resources/cloud/load_balancers/l7_policies/rules.py @@ -7,7 +7,7 @@ import httpx from ....._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -110,7 +110,12 @@ def create( if not l7policy_id: raise ValueError(f"Expected a non-empty value for `l7policy_id` but received {l7policy_id!r}") return self._post( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + ), body=maybe_transform( { "compare_type": compare_type, @@ -166,7 +171,12 @@ def list( if not l7policy_id: raise ValueError(f"Expected a non-empty value for `l7policy_id` but received {l7policy_id!r}") return self._get( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -216,7 +226,13 @@ def delete( if not l7rule_id: raise ValueError(f"Expected a non-empty value for `l7rule_id` but received {l7rule_id!r}") return self._delete( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + l7rule_id=l7rule_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -266,7 +282,13 @@ def get( if not l7rule_id: raise ValueError(f"Expected a non-empty value for `l7rule_id` but received {l7rule_id!r}") return self._get( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + l7rule_id=l7rule_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -344,7 +366,13 @@ def replace( if not l7rule_id: raise ValueError(f"Expected a non-empty value for `l7rule_id` but received {l7rule_id!r}") return self._put( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + l7rule_id=l7rule_id, + ), body=maybe_transform( { "compare_type": compare_type, @@ -617,7 +645,12 @@ async def create( if not l7policy_id: raise ValueError(f"Expected a non-empty value for `l7policy_id` but received {l7policy_id!r}") return await self._post( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + ), body=await async_maybe_transform( { "compare_type": compare_type, @@ -673,7 +706,12 @@ async def list( if not l7policy_id: raise ValueError(f"Expected a non-empty value for `l7policy_id` but received {l7policy_id!r}") return await self._get( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -723,7 +761,13 @@ async def delete( if not l7rule_id: raise ValueError(f"Expected a non-empty value for `l7rule_id` but received {l7rule_id!r}") return await self._delete( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + l7rule_id=l7rule_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -773,7 +817,13 @@ async def get( if not l7rule_id: raise ValueError(f"Expected a non-empty value for `l7rule_id` but received {l7rule_id!r}") return await self._get( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + l7rule_id=l7rule_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -851,7 +901,13 @@ async def replace( if not l7rule_id: raise ValueError(f"Expected a non-empty value for `l7rule_id` but received {l7rule_id!r}") return await self._put( - f"/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + path_template( + "/cloud/v1/l7policies/{project_id}/{region_id}/{l7policy_id}/rules/{l7rule_id}", + project_id=project_id, + region_id=region_id, + l7policy_id=l7policy_id, + l7rule_id=l7rule_id, + ), body=await async_maybe_transform( { "compare_type": compare_type, diff --git a/src/gcore/resources/cloud/load_balancers/listeners.py b/src/gcore/resources/cloud/load_balancers/listeners.py index b3cc6b7e..cd6c6dcc 100644 --- a/src/gcore/resources/cloud/load_balancers/listeners.py +++ b/src/gcore/resources/cloud/load_balancers/listeners.py @@ -8,7 +8,7 @@ import httpx from ...._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -139,7 +139,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/lblisteners/{project_id}/{region_id}", + path_template("/cloud/v1/lblisteners/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "load_balancer_id": load_balancer_id, @@ -240,7 +240,12 @@ def update( if not listener_id: raise ValueError(f"Expected a non-empty value for `listener_id` but received {listener_id!r}") return self._patch( - f"/cloud/v2/lblisteners/{project_id}/{region_id}/{listener_id}", + path_template( + "/cloud/v2/lblisteners/{project_id}/{region_id}/{listener_id}", + project_id=project_id, + region_id=region_id, + listener_id=listener_id, + ), body=maybe_transform( { "admin_state_up": admin_state_up, @@ -301,7 +306,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/lblisteners/{project_id}/{region_id}", + path_template("/cloud/v1/lblisteners/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -359,7 +364,12 @@ def delete( if not listener_id: raise ValueError(f"Expected a non-empty value for `listener_id` but received {listener_id!r}") return self._delete( - f"/cloud/v1/lblisteners/{project_id}/{region_id}/{listener_id}", + path_template( + "/cloud/v1/lblisteners/{project_id}/{region_id}/{listener_id}", + project_id=project_id, + region_id=region_id, + listener_id=listener_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -413,7 +423,12 @@ def get( if not listener_id: raise ValueError(f"Expected a non-empty value for `listener_id` but received {listener_id!r}") return self._get( - f"/cloud/v1/lblisteners/{project_id}/{region_id}/{listener_id}", + path_template( + "/cloud/v1/lblisteners/{project_id}/{region_id}/{listener_id}", + project_id=project_id, + region_id=region_id, + listener_id=listener_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -697,7 +712,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/lblisteners/{project_id}/{region_id}", + path_template("/cloud/v1/lblisteners/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "load_balancer_id": load_balancer_id, @@ -798,7 +813,12 @@ async def update( if not listener_id: raise ValueError(f"Expected a non-empty value for `listener_id` but received {listener_id!r}") return await self._patch( - f"/cloud/v2/lblisteners/{project_id}/{region_id}/{listener_id}", + path_template( + "/cloud/v2/lblisteners/{project_id}/{region_id}/{listener_id}", + project_id=project_id, + region_id=region_id, + listener_id=listener_id, + ), body=await async_maybe_transform( { "admin_state_up": admin_state_up, @@ -859,7 +879,7 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/lblisteners/{project_id}/{region_id}", + path_template("/cloud/v1/lblisteners/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -917,7 +937,12 @@ async def delete( if not listener_id: raise ValueError(f"Expected a non-empty value for `listener_id` but received {listener_id!r}") return await self._delete( - f"/cloud/v1/lblisteners/{project_id}/{region_id}/{listener_id}", + path_template( + "/cloud/v1/lblisteners/{project_id}/{region_id}/{listener_id}", + project_id=project_id, + region_id=region_id, + listener_id=listener_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -971,7 +996,12 @@ async def get( if not listener_id: raise ValueError(f"Expected a non-empty value for `listener_id` but received {listener_id!r}") return await self._get( - f"/cloud/v1/lblisteners/{project_id}/{region_id}/{listener_id}", + path_template( + "/cloud/v1/lblisteners/{project_id}/{region_id}/{listener_id}", + project_id=project_id, + region_id=region_id, + listener_id=listener_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/cloud/load_balancers/load_balancers.py b/src/gcore/resources/cloud/load_balancers/load_balancers.py index e3ec8a2a..c9dd19be 100644 --- a/src/gcore/resources/cloud/load_balancers/load_balancers.py +++ b/src/gcore/resources/cloud/load_balancers/load_balancers.py @@ -33,7 +33,7 @@ AsyncStatusesResourceWithStreamingResponse, ) from ...._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from .listeners import ( ListenersResource, AsyncListenersResource, @@ -225,7 +225,9 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "flavor": flavor, @@ -327,7 +329,12 @@ def update( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return self._patch( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), body=maybe_transform( { "logging": logging, @@ -424,7 +431,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), page=SyncOffsetPage[LoadBalancer], options=make_request_options( extra_headers=extra_headers, @@ -682,7 +691,12 @@ def delete( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return self._delete( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -730,7 +744,12 @@ def failover( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return self._post( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/failover", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/failover", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), body=maybe_transform({"force": force}, load_balancer_failover_params.LoadBalancerFailoverParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -782,7 +801,12 @@ def get( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return self._get( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -840,7 +864,12 @@ def resize( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return self._post( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/resize", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/resize", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), body=maybe_transform({"flavor": flavor}, load_balancer_resize_params.LoadBalancerResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -987,7 +1016,9 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "flavor": flavor, @@ -1089,7 +1120,12 @@ async def update( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return await self._patch( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), body=await async_maybe_transform( { "logging": logging, @@ -1186,7 +1222,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), page=AsyncOffsetPage[LoadBalancer], options=make_request_options( extra_headers=extra_headers, @@ -1444,7 +1482,12 @@ async def delete( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return await self._delete( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1492,7 +1535,12 @@ async def failover( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return await self._post( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/failover", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/failover", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), body=await async_maybe_transform( {"force": force}, load_balancer_failover_params.LoadBalancerFailoverParams ), @@ -1546,7 +1594,12 @@ async def get( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return await self._get( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1604,7 +1657,12 @@ async def resize( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return await self._post( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/resize", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/resize", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), body=await async_maybe_transform({"flavor": flavor}, load_balancer_resize_params.LoadBalancerResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gcore/resources/cloud/load_balancers/metrics.py b/src/gcore/resources/cloud/load_balancers/metrics.py index a66adc6e..e2cca3e6 100644 --- a/src/gcore/resources/cloud/load_balancers/metrics.py +++ b/src/gcore/resources/cloud/load_balancers/metrics.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Query, Headers, NotGiven, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -87,7 +87,12 @@ def list( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return self._post( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/metrics", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/metrics", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), body=maybe_transform( { "time_interval": time_interval, @@ -166,7 +171,12 @@ async def list( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return await self._post( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/metrics", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/metrics", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), body=await async_maybe_transform( { "time_interval": time_interval, diff --git a/src/gcore/resources/cloud/load_balancers/pools/health_monitors.py b/src/gcore/resources/cloud/load_balancers/pools/health_monitors.py index 33f56bcc..9b3fff25 100644 --- a/src/gcore/resources/cloud/load_balancers/pools/health_monitors.py +++ b/src/gcore/resources/cloud/load_balancers/pools/health_monitors.py @@ -7,7 +7,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -120,7 +120,12 @@ def create( if not pool_id: raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") return self._post( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/healthmonitor", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/healthmonitor", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), body=maybe_transform( { "delay": delay, @@ -183,7 +188,12 @@ def delete( raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/healthmonitor", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/healthmonitor", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -285,7 +295,12 @@ async def create( if not pool_id: raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") return await self._post( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/healthmonitor", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/healthmonitor", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), body=await async_maybe_transform( { "delay": delay, @@ -348,7 +363,12 @@ async def delete( raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/healthmonitor", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/healthmonitor", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/load_balancers/pools/members.py b/src/gcore/resources/cloud/load_balancers/pools/members.py index 09839b3e..746b40ed 100644 --- a/src/gcore/resources/cloud/load_balancers/pools/members.py +++ b/src/gcore/resources/cloud/load_balancers/pools/members.py @@ -7,7 +7,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -135,7 +135,12 @@ def create( if not pool_id: raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") return self._post( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/member", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/member", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), body=maybe_transform( { "address": address, @@ -199,7 +204,13 @@ def delete( if not member_id: raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}") return self._delete( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/member/{member_id}", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/member/{member_id}", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + member_id=member_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -319,7 +330,12 @@ async def create( if not pool_id: raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") return await self._post( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/member", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/member", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), body=await async_maybe_transform( { "address": address, @@ -383,7 +399,13 @@ async def delete( if not member_id: raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}") return await self._delete( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/member/{member_id}", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}/member/{member_id}", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + member_id=member_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/load_balancers/pools/pools.py b/src/gcore/resources/cloud/load_balancers/pools/pools.py index 8dc3f903..ea10ebba 100644 --- a/src/gcore/resources/cloud/load_balancers/pools/pools.py +++ b/src/gcore/resources/cloud/load_balancers/pools/pools.py @@ -15,7 +15,7 @@ AsyncMembersResourceWithStreamingResponse, ) from ....._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -155,7 +155,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/lbpools/{project_id}/{region_id}", + path_template("/cloud/v1/lbpools/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "lb_algorithm": lb_algorithm, @@ -279,7 +279,12 @@ def update( if not pool_id: raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") return self._patch( - f"/cloud/v2/lbpools/{project_id}/{region_id}/{pool_id}", + path_template( + "/cloud/v2/lbpools/{project_id}/{region_id}/{pool_id}", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), body=maybe_transform( { "admin_state_up": admin_state_up, @@ -346,7 +351,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/lbpools/{project_id}/{region_id}", + path_template("/cloud/v1/lbpools/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -402,7 +407,12 @@ def delete( if not pool_id: raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") return self._delete( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -447,7 +457,12 @@ def get( if not pool_id: raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") return self._get( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -737,7 +752,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/lbpools/{project_id}/{region_id}", + path_template("/cloud/v1/lbpools/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "lb_algorithm": lb_algorithm, @@ -861,7 +876,12 @@ async def update( if not pool_id: raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") return await self._patch( - f"/cloud/v2/lbpools/{project_id}/{region_id}/{pool_id}", + path_template( + "/cloud/v2/lbpools/{project_id}/{region_id}/{pool_id}", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), body=await async_maybe_transform( { "admin_state_up": admin_state_up, @@ -928,7 +948,7 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/lbpools/{project_id}/{region_id}", + path_template("/cloud/v1/lbpools/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -984,7 +1004,12 @@ async def delete( if not pool_id: raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") return await self._delete( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1029,7 +1054,12 @@ async def get( if not pool_id: raise ValueError(f"Expected a non-empty value for `pool_id` but received {pool_id!r}") return await self._get( - f"/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}", + path_template( + "/cloud/v1/lbpools/{project_id}/{region_id}/{pool_id}", + project_id=project_id, + region_id=region_id, + pool_id=pool_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/load_balancers/statuses.py b/src/gcore/resources/cloud/load_balancers/statuses.py index c2711ddd..48bc5e50 100644 --- a/src/gcore/resources/cloud/load_balancers/statuses.py +++ b/src/gcore/resources/cloud/load_balancers/statuses.py @@ -5,6 +5,7 @@ import httpx from ...._types import Body, Query, Headers, NotGiven, not_given +from ...._utils import path_template from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -73,7 +74,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/status", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/status", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -118,7 +121,12 @@ def get( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return self._get( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/status", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/status", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -179,7 +187,9 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/status", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/status", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -224,7 +234,12 @@ async def get( if not load_balancer_id: raise ValueError(f"Expected a non-empty value for `load_balancer_id` but received {load_balancer_id!r}") return await self._get( - f"/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/status", + path_template( + "/cloud/v1/loadbalancers/{project_id}/{region_id}/{load_balancer_id}/status", + project_id=project_id, + region_id=region_id, + load_balancer_id=load_balancer_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/networks/networks.py b/src/gcore/resources/cloud/networks/networks.py index 88349304..89db0c53 100644 --- a/src/gcore/resources/cloud/networks/networks.py +++ b/src/gcore/resources/cloud/networks/networks.py @@ -24,7 +24,7 @@ AsyncSubnetsResourceWithStreamingResponse, ) from ...._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -131,7 +131,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/networks/{project_id}/{region_id}", + path_template("/cloud/v1/networks/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "name": name, @@ -266,7 +266,12 @@ def update( if not network_id: raise ValueError(f"Expected a non-empty value for `network_id` but received {network_id!r}") return self._patch( - f"/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + path_template( + "/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + project_id=project_id, + region_id=region_id, + network_id=network_id, + ), body=maybe_transform( { "name": name, @@ -350,7 +355,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/networks/{project_id}/{region_id}", + path_template("/cloud/v1/networks/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=SyncOffsetPage[Network], options=make_request_options( extra_headers=extra_headers, @@ -413,7 +418,12 @@ def delete( if not network_id: raise ValueError(f"Expected a non-empty value for `network_id` but received {network_id!r}") return self._delete( - f"/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + path_template( + "/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + project_id=project_id, + region_id=region_id, + network_id=network_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -492,7 +502,12 @@ def get( if not network_id: raise ValueError(f"Expected a non-empty value for `network_id` but received {network_id!r}") return self._get( - f"/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + path_template( + "/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + project_id=project_id, + region_id=region_id, + network_id=network_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -588,7 +603,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/networks/{project_id}/{region_id}", + path_template("/cloud/v1/networks/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "name": name, @@ -723,7 +738,12 @@ async def update( if not network_id: raise ValueError(f"Expected a non-empty value for `network_id` but received {network_id!r}") return await self._patch( - f"/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + path_template( + "/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + project_id=project_id, + region_id=region_id, + network_id=network_id, + ), body=await async_maybe_transform( { "name": name, @@ -807,7 +827,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/networks/{project_id}/{region_id}", + path_template("/cloud/v1/networks/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=AsyncOffsetPage[Network], options=make_request_options( extra_headers=extra_headers, @@ -870,7 +890,12 @@ async def delete( if not network_id: raise ValueError(f"Expected a non-empty value for `network_id` but received {network_id!r}") return await self._delete( - f"/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + path_template( + "/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + project_id=project_id, + region_id=region_id, + network_id=network_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -949,7 +974,12 @@ async def get( if not network_id: raise ValueError(f"Expected a non-empty value for `network_id` but received {network_id!r}") return await self._get( - f"/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + path_template( + "/cloud/v1/networks/{project_id}/{region_id}/{network_id}", + project_id=project_id, + region_id=region_id, + network_id=network_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/networks/routers.py b/src/gcore/resources/cloud/networks/routers.py index 1d32e324..79db2f50 100644 --- a/src/gcore/resources/cloud/networks/routers.py +++ b/src/gcore/resources/cloud/networks/routers.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -97,7 +97,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/routers/{project_id}/{region_id}", + path_template("/cloud/v1/routers/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "name": name, @@ -157,7 +157,12 @@ def update( if not router_id: raise ValueError(f"Expected a non-empty value for `router_id` but received {router_id!r}") return self._patch( - f"/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + path_template( + "/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + project_id=project_id, + region_id=region_id, + router_id=router_id, + ), body=maybe_transform( { "external_gateway_info": external_gateway_info, @@ -207,7 +212,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/routers/{project_id}/{region_id}", + path_template("/cloud/v1/routers/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=SyncOffsetPage[Router], options=make_request_options( extra_headers=extra_headers, @@ -257,7 +262,12 @@ def delete( if not router_id: raise ValueError(f"Expected a non-empty value for `router_id` but received {router_id!r}") return self._delete( - f"/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + path_template( + "/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + project_id=project_id, + region_id=region_id, + router_id=router_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -309,7 +319,12 @@ def attach_subnet( if not router_id: raise ValueError(f"Expected a non-empty value for `router_id` but received {router_id!r}") return self._post( - f"/cloud/v1/routers/{project_id}/{region_id}/{router_id}/attach", + path_template( + "/cloud/v1/routers/{project_id}/{region_id}/{router_id}/attach", + project_id=project_id, + region_id=region_id, + router_id=router_id, + ), body=maybe_transform( { "subnet_id": subnet_id, @@ -358,7 +373,12 @@ def detach_subnet( if not router_id: raise ValueError(f"Expected a non-empty value for `router_id` but received {router_id!r}") return self._post( - f"/cloud/v1/routers/{project_id}/{region_id}/{router_id}/detach", + path_template( + "/cloud/v1/routers/{project_id}/{region_id}/{router_id}/detach", + project_id=project_id, + region_id=region_id, + router_id=router_id, + ), body=maybe_transform({"subnet_id": subnet_id}, router_detach_subnet_params.RouterDetachSubnetParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -398,7 +418,12 @@ def get( if not router_id: raise ValueError(f"Expected a non-empty value for `router_id` but received {router_id!r}") return self._get( - f"/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + path_template( + "/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + project_id=project_id, + region_id=region_id, + router_id=router_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -471,7 +496,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/routers/{project_id}/{region_id}", + path_template("/cloud/v1/routers/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "name": name, @@ -531,7 +556,12 @@ async def update( if not router_id: raise ValueError(f"Expected a non-empty value for `router_id` but received {router_id!r}") return await self._patch( - f"/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + path_template( + "/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + project_id=project_id, + region_id=region_id, + router_id=router_id, + ), body=await async_maybe_transform( { "external_gateway_info": external_gateway_info, @@ -581,7 +611,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/routers/{project_id}/{region_id}", + path_template("/cloud/v1/routers/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=AsyncOffsetPage[Router], options=make_request_options( extra_headers=extra_headers, @@ -631,7 +661,12 @@ async def delete( if not router_id: raise ValueError(f"Expected a non-empty value for `router_id` but received {router_id!r}") return await self._delete( - f"/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + path_template( + "/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + project_id=project_id, + region_id=region_id, + router_id=router_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -683,7 +718,12 @@ async def attach_subnet( if not router_id: raise ValueError(f"Expected a non-empty value for `router_id` but received {router_id!r}") return await self._post( - f"/cloud/v1/routers/{project_id}/{region_id}/{router_id}/attach", + path_template( + "/cloud/v1/routers/{project_id}/{region_id}/{router_id}/attach", + project_id=project_id, + region_id=region_id, + router_id=router_id, + ), body=await async_maybe_transform( { "subnet_id": subnet_id, @@ -732,7 +772,12 @@ async def detach_subnet( if not router_id: raise ValueError(f"Expected a non-empty value for `router_id` but received {router_id!r}") return await self._post( - f"/cloud/v1/routers/{project_id}/{region_id}/{router_id}/detach", + path_template( + "/cloud/v1/routers/{project_id}/{region_id}/{router_id}/detach", + project_id=project_id, + region_id=region_id, + router_id=router_id, + ), body=await async_maybe_transform( {"subnet_id": subnet_id}, router_detach_subnet_params.RouterDetachSubnetParams ), @@ -774,7 +819,12 @@ async def get( if not router_id: raise ValueError(f"Expected a non-empty value for `router_id` but received {router_id!r}") return await self._get( - f"/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + path_template( + "/cloud/v1/routers/{project_id}/{region_id}/{router_id}", + project_id=project_id, + region_id=region_id, + router_id=router_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/networks/subnets.py b/src/gcore/resources/cloud/networks/subnets.py index ddf5baaf..3ceaa0ac 100644 --- a/src/gcore/resources/cloud/networks/subnets.py +++ b/src/gcore/resources/cloud/networks/subnets.py @@ -8,7 +8,7 @@ import httpx from ...._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -130,7 +130,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/subnets/{project_id}/{region_id}", + path_template("/cloud/v1/subnets/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "cidr": cidr, @@ -294,7 +294,12 @@ def update( if not subnet_id: raise ValueError(f"Expected a non-empty value for `subnet_id` but received {subnet_id!r}") return self._patch( - f"/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + path_template( + "/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + project_id=project_id, + region_id=region_id, + subnet_id=subnet_id, + ), body=maybe_transform( { "dns_nameservers": dns_nameservers, @@ -388,7 +393,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/subnets/{project_id}/{region_id}", + path_template("/cloud/v1/subnets/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=SyncOffsetPage[Subnet], options=make_request_options( extra_headers=extra_headers, @@ -449,7 +454,12 @@ def delete( if not subnet_id: raise ValueError(f"Expected a non-empty value for `subnet_id` but received {subnet_id!r}") return self._delete( - f"/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + path_template( + "/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + project_id=project_id, + region_id=region_id, + subnet_id=subnet_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -494,7 +504,12 @@ def get( if not subnet_id: raise ValueError(f"Expected a non-empty value for `subnet_id` but received {subnet_id!r}") return self._get( - f"/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + path_template( + "/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + project_id=project_id, + region_id=region_id, + subnet_id=subnet_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -603,7 +618,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/subnets/{project_id}/{region_id}", + path_template("/cloud/v1/subnets/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "cidr": cidr, @@ -767,7 +782,12 @@ async def update( if not subnet_id: raise ValueError(f"Expected a non-empty value for `subnet_id` but received {subnet_id!r}") return await self._patch( - f"/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + path_template( + "/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + project_id=project_id, + region_id=region_id, + subnet_id=subnet_id, + ), body=await async_maybe_transform( { "dns_nameservers": dns_nameservers, @@ -861,7 +881,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/subnets/{project_id}/{region_id}", + path_template("/cloud/v1/subnets/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=AsyncOffsetPage[Subnet], options=make_request_options( extra_headers=extra_headers, @@ -922,7 +942,12 @@ async def delete( if not subnet_id: raise ValueError(f"Expected a non-empty value for `subnet_id` but received {subnet_id!r}") return await self._delete( - f"/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + path_template( + "/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + project_id=project_id, + region_id=region_id, + subnet_id=subnet_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -967,7 +992,12 @@ async def get( if not subnet_id: raise ValueError(f"Expected a non-empty value for `subnet_id` but received {subnet_id!r}") return await self._get( - f"/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + path_template( + "/cloud/v1/subnets/{project_id}/{region_id}/{subnet_id}", + project_id=project_id, + region_id=region_id, + subnet_id=subnet_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/placement_groups.py b/src/gcore/resources/cloud/placement_groups.py index d51fd37d..077f93ae 100644 --- a/src/gcore/resources/cloud/placement_groups.py +++ b/src/gcore/resources/cloud/placement_groups.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Query, Headers, NotGiven, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -84,7 +84,9 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/servergroups/{project_id}/{region_id}", + path_template( + "/cloud/v1/servergroups/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "name": name, @@ -127,7 +129,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/servergroups/{project_id}/{region_id}", + path_template( + "/cloud/v1/servergroups/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -166,7 +170,12 @@ def delete( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return self._delete( - f"/cloud/v1/servergroups/{project_id}/{region_id}/{group_id}", + path_template( + "/cloud/v1/servergroups/{project_id}/{region_id}/{group_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -205,7 +214,12 @@ def get( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return self._get( - f"/cloud/v1/servergroups/{project_id}/{region_id}/{group_id}", + path_template( + "/cloud/v1/servergroups/{project_id}/{region_id}/{group_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -272,7 +286,9 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/servergroups/{project_id}/{region_id}", + path_template( + "/cloud/v1/servergroups/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "name": name, @@ -315,7 +331,9 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/servergroups/{project_id}/{region_id}", + path_template( + "/cloud/v1/servergroups/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -354,7 +372,12 @@ async def delete( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return await self._delete( - f"/cloud/v1/servergroups/{project_id}/{region_id}/{group_id}", + path_template( + "/cloud/v1/servergroups/{project_id}/{region_id}/{group_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -393,7 +416,12 @@ async def get( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return await self._get( - f"/cloud/v1/servergroups/{project_id}/{region_id}/{group_id}", + path_template( + "/cloud/v1/servergroups/{project_id}/{region_id}/{group_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/projects.py b/src/gcore/resources/cloud/projects.py index 2ef02386..fe2bcc54 100644 --- a/src/gcore/resources/cloud/projects.py +++ b/src/gcore/resources/cloud/projects.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -131,7 +131,7 @@ def update( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._patch( - f"/cloud/v1/projects/{project_id}", + path_template("/cloud/v1/projects/{project_id}", project_id=project_id), body=maybe_transform( { "description": description, @@ -237,7 +237,7 @@ def delete( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._delete( - f"/cloud/v1/projects/{project_id}", + path_template("/cloud/v1/projects/{project_id}", project_id=project_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -272,7 +272,7 @@ def get( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get( - f"/cloud/v1/projects/{project_id}", + path_template("/cloud/v1/projects/{project_id}", project_id=project_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -385,7 +385,7 @@ async def update( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return await self._patch( - f"/cloud/v1/projects/{project_id}", + path_template("/cloud/v1/projects/{project_id}", project_id=project_id), body=await async_maybe_transform( { "description": description, @@ -491,7 +491,7 @@ async def delete( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return await self._delete( - f"/cloud/v1/projects/{project_id}", + path_template("/cloud/v1/projects/{project_id}", project_id=project_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -526,7 +526,7 @@ async def get( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return await self._get( - f"/cloud/v1/projects/{project_id}", + path_template("/cloud/v1/projects/{project_id}", project_id=project_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/quotas/quotas.py b/src/gcore/resources/cloud/quotas/quotas.py index 915d900d..1e0b2f9b 100644 --- a/src/gcore/resources/cloud/quotas/quotas.py +++ b/src/gcore/resources/cloud/quotas/quotas.py @@ -13,6 +13,7 @@ AsyncRequestsResourceWithStreamingResponse, ) from ...._types import Body, Query, Headers, NotGiven, not_given +from ...._utils import path_template from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -103,7 +104,9 @@ def get_by_region( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v2/regional_quotas/{client_id}/{region_id}", + path_template( + "/cloud/v2/regional_quotas/{client_id}/{region_id}", client_id=client_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -136,7 +139,7 @@ def get_global( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cloud/v2/global_quotas/{client_id}", + path_template("/cloud/v2/global_quotas/{client_id}", client_id=client_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -218,7 +221,9 @@ async def get_by_region( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v2/regional_quotas/{client_id}/{region_id}", + path_template( + "/cloud/v2/regional_quotas/{client_id}/{region_id}", client_id=client_id, region_id=region_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -251,7 +256,7 @@ async def get_global( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cloud/v2/global_quotas/{client_id}", + path_template("/cloud/v2/global_quotas/{client_id}", client_id=client_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/quotas/requests.py b/src/gcore/resources/cloud/quotas/requests.py index 5a12175b..6c7ccfe0 100644 --- a/src/gcore/resources/cloud/quotas/requests.py +++ b/src/gcore/resources/cloud/quotas/requests.py @@ -9,7 +9,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -182,7 +182,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v2/limits_request/{request_id}", + path_template("/cloud/v2/limits_request/{request_id}", request_id=request_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -215,7 +215,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/cloud/v2/limits_request/{request_id}", + path_template("/cloud/v2/limits_request/{request_id}", request_id=request_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -378,7 +378,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v2/limits_request/{request_id}", + path_template("/cloud/v2/limits_request/{request_id}", request_id=request_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -411,7 +411,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/cloud/v2/limits_request/{request_id}", + path_template("/cloud/v2/limits_request/{request_id}", request_id=request_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/regions.py b/src/gcore/resources/cloud/regions.py index addf6699..66124428 100644 --- a/src/gcore/resources/cloud/regions.py +++ b/src/gcore/resources/cloud/regions.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -146,7 +146,7 @@ def get( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/regions/{region_id}", + path_template("/cloud/v1/regions/{region_id}", region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -280,7 +280,7 @@ async def get( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/regions/{region_id}", + path_template("/cloud/v1/regions/{region_id}", region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/cloud/registries/artifacts.py b/src/gcore/resources/cloud/registries/artifacts.py index 4b07607a..ac4aeaf3 100644 --- a/src/gcore/resources/cloud/registries/artifacts.py +++ b/src/gcore/resources/cloud/registries/artifacts.py @@ -5,6 +5,7 @@ import httpx from ...._types import Body, Query, Headers, NoneType, NotGiven, not_given +from ...._utils import path_template from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -72,7 +73,13 @@ def list( if not repository_name: raise ValueError(f"Expected a non-empty value for `repository_name` but received {repository_name!r}") return self._get( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + repository_name=repository_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -116,7 +123,14 @@ def delete( raise ValueError(f"Expected a non-empty value for `digest` but received {digest!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts/{digest}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts/{digest}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + repository_name=repository_name, + digest=digest, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -177,7 +191,13 @@ async def list( if not repository_name: raise ValueError(f"Expected a non-empty value for `repository_name` but received {repository_name!r}") return await self._get( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + repository_name=repository_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -221,7 +241,14 @@ async def delete( raise ValueError(f"Expected a non-empty value for `digest` but received {digest!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts/{digest}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts/{digest}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + repository_name=repository_name, + digest=digest, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/registries/registries.py b/src/gcore/resources/cloud/registries/registries.py index 0ba3414e..bac7fe81 100644 --- a/src/gcore/resources/cloud/registries/registries.py +++ b/src/gcore/resources/cloud/registries/registries.py @@ -21,7 +21,7 @@ AsyncUsersResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from .artifacts import ( ArtifactsResource, AsyncArtifactsResource, @@ -129,7 +129,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/registries/{project_id}/{region_id}", + path_template("/cloud/v1/registries/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "name": name, @@ -172,7 +172,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/registries/{project_id}/{region_id}", + path_template("/cloud/v1/registries/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -210,7 +210,12 @@ def delete( region_id = self._client._get_cloud_region_id_path_param() extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -247,7 +252,12 @@ def get( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -287,7 +297,12 @@ def resize( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._patch( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/resize", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/resize", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), body=maybe_transform({"storage_limit": storage_limit}, registry_resize_params.RegistryResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -371,7 +386,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/registries/{project_id}/{region_id}", + path_template("/cloud/v1/registries/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "name": name, @@ -414,7 +429,7 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/registries/{project_id}/{region_id}", + path_template("/cloud/v1/registries/{project_id}/{region_id}", project_id=project_id, region_id=region_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -452,7 +467,12 @@ async def delete( region_id = self._client._get_cloud_region_id_path_param() extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -489,7 +509,12 @@ async def get( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -529,7 +554,12 @@ async def resize( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._patch( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/resize", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/resize", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), body=await async_maybe_transform( {"storage_limit": storage_limit}, registry_resize_params.RegistryResizeParams ), diff --git a/src/gcore/resources/cloud/registries/repositories.py b/src/gcore/resources/cloud/registries/repositories.py index d0c860a9..bccb29ff 100644 --- a/src/gcore/resources/cloud/registries/repositories.py +++ b/src/gcore/resources/cloud/registries/repositories.py @@ -5,6 +5,7 @@ import httpx from ...._types import Body, Query, Headers, NoneType, NotGiven, not_given +from ...._utils import path_template from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -69,7 +70,12 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -110,7 +116,13 @@ def delete( raise ValueError(f"Expected a non-empty value for `repository_name` but received {repository_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + repository_name=repository_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -168,7 +180,12 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -209,7 +226,13 @@ async def delete( raise ValueError(f"Expected a non-empty value for `repository_name` but received {repository_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + repository_name=repository_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/registries/tags.py b/src/gcore/resources/cloud/registries/tags.py index 74f68017..064f3c03 100644 --- a/src/gcore/resources/cloud/registries/tags.py +++ b/src/gcore/resources/cloud/registries/tags.py @@ -5,6 +5,7 @@ import httpx from ...._types import Body, Query, Headers, NoneType, NotGiven, not_given +from ...._utils import path_template from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -78,7 +79,15 @@ def delete( raise ValueError(f"Expected a non-empty value for `tag_name` but received {tag_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts/{digest}/tags/{tag_name}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts/{digest}/tags/{tag_name}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + repository_name=repository_name, + digest=digest, + tag_name=tag_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -146,7 +155,15 @@ async def delete( raise ValueError(f"Expected a non-empty value for `tag_name` but received {tag_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts/{digest}/tags/{tag_name}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/repositories/{repository_name}/artifacts/{digest}/tags/{tag_name}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + repository_name=repository_name, + digest=digest, + tag_name=tag_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/registries/users.py b/src/gcore/resources/cloud/registries/users.py index 5225429a..4cf242ad 100644 --- a/src/gcore/resources/cloud/registries/users.py +++ b/src/gcore/resources/cloud/registries/users.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -92,7 +92,12 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), body=maybe_transform( { "duration": duration, @@ -145,7 +150,13 @@ def update( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._patch( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + user_id=user_id, + ), body=maybe_transform( { "duration": duration, @@ -189,7 +200,12 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -228,7 +244,13 @@ def delete( region_id = self._client._get_cloud_region_id_path_param() extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + user_id=user_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -268,7 +290,12 @@ def create_multiple( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/batch", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/batch", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), body=maybe_transform({"users": users}, user_create_multiple_params.UserCreateMultipleParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -307,7 +334,13 @@ def refresh_secret( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}/refresh_secret", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}/refresh_secret", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + user_id=user_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -381,7 +414,12 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), body=await async_maybe_transform( { "duration": duration, @@ -434,7 +472,13 @@ async def update( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._patch( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + user_id=user_id, + ), body=await async_maybe_transform( { "duration": duration, @@ -478,7 +522,12 @@ async def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._get( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -517,7 +566,13 @@ async def delete( region_id = self._client._get_cloud_region_id_path_param() extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + user_id=user_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -557,7 +612,12 @@ async def create_multiple( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/batch", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/batch", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + ), body=await async_maybe_transform({"users": users}, user_create_multiple_params.UserCreateMultipleParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -596,7 +656,13 @@ async def refresh_secret( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}/refresh_secret", + path_template( + "/cloud/v1/registries/{project_id}/{region_id}/{registry_id}/users/{user_id}/refresh_secret", + project_id=project_id, + region_id=region_id, + registry_id=registry_id, + user_id=user_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/reserved_fixed_ips/reserved_fixed_ips.py b/src/gcore/resources/cloud/reserved_fixed_ips/reserved_fixed_ips.py index 4bcd8c5a..242a3419 100644 --- a/src/gcore/resources/cloud/reserved_fixed_ips/reserved_fixed_ips.py +++ b/src/gcore/resources/cloud/reserved_fixed_ips/reserved_fixed_ips.py @@ -16,7 +16,7 @@ AsyncVipResourceWithStreamingResponse, ) from ...._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import required_args, maybe_transform, async_maybe_transform +from ...._utils import path_template, required_args, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -283,7 +283,9 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "type": type, @@ -337,7 +339,12 @@ def update( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return self._patch( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), body=maybe_transform({"is_vip": is_vip}, reserved_fixed_ip_update_params.ReservedFixedIPUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -404,7 +411,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), page=SyncOffsetPage[ReservedFixedIP], options=make_request_options( extra_headers=extra_headers, @@ -461,7 +470,12 @@ def delete( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return self._delete( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -500,7 +514,12 @@ def get( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return self._get( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1052,7 +1071,9 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "type": type, @@ -1106,7 +1127,12 @@ async def update( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return await self._patch( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), body=await async_maybe_transform( {"is_vip": is_vip}, reserved_fixed_ip_update_params.ReservedFixedIPUpdateParams ), @@ -1175,7 +1201,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), page=AsyncOffsetPage[ReservedFixedIP], options=make_request_options( extra_headers=extra_headers, @@ -1232,7 +1260,12 @@ async def delete( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return await self._delete( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1271,7 +1304,12 @@ async def get( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return await self._get( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/reserved_fixed_ips/vip/candidate_ports.py b/src/gcore/resources/cloud/reserved_fixed_ips/vip/candidate_ports.py index fdc29228..bf569f74 100644 --- a/src/gcore/resources/cloud/reserved_fixed_ips/vip/candidate_ports.py +++ b/src/gcore/resources/cloud/reserved_fixed_ips/vip/candidate_ports.py @@ -5,6 +5,7 @@ import httpx from ....._types import Body, Query, Headers, NotGiven, not_given +from ....._utils import path_template from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -71,7 +72,12 @@ def list( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return self._get( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/available_devices", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/available_devices", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -131,7 +137,12 @@ async def list( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return await self._get( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/available_devices", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/available_devices", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/reserved_fixed_ips/vip/connected_ports.py b/src/gcore/resources/cloud/reserved_fixed_ips/vip/connected_ports.py index f98e4b8a..0d82b5d5 100644 --- a/src/gcore/resources/cloud/reserved_fixed_ips/vip/connected_ports.py +++ b/src/gcore/resources/cloud/reserved_fixed_ips/vip/connected_ports.py @@ -5,7 +5,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -73,7 +73,12 @@ def list( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return self._get( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -115,7 +120,12 @@ def add( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return self._patch( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), body=maybe_transform({"port_ids": port_ids}, connected_port_add_params.ConnectedPortAddParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -158,7 +168,12 @@ def replace( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return self._put( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), body=maybe_transform({"port_ids": port_ids}, connected_port_replace_params.ConnectedPortReplaceParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -219,7 +234,12 @@ async def list( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return await self._get( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -261,7 +281,12 @@ async def add( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return await self._patch( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), body=await async_maybe_transform({"port_ids": port_ids}, connected_port_add_params.ConnectedPortAddParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -304,7 +329,12 @@ async def replace( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return await self._put( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}/connected_devices", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), body=await async_maybe_transform( {"port_ids": port_ids}, connected_port_replace_params.ConnectedPortReplaceParams ), diff --git a/src/gcore/resources/cloud/reserved_fixed_ips/vip/vip.py b/src/gcore/resources/cloud/reserved_fixed_ips/vip/vip.py index 58ff9bd5..47936dae 100644 --- a/src/gcore/resources/cloud/reserved_fixed_ips/vip/vip.py +++ b/src/gcore/resources/cloud/reserved_fixed_ips/vip/vip.py @@ -5,7 +5,7 @@ import httpx from ....._types import Body, Query, Headers, NotGiven, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -100,7 +100,12 @@ def toggle( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return self._patch( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), body=maybe_transform({"is_vip": is_vip}, vip_toggle_params.VipToggleParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -172,7 +177,12 @@ async def toggle( if not port_id: raise ValueError(f"Expected a non-empty value for `port_id` but received {port_id!r}") return await self._patch( - f"/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + path_template( + "/cloud/v1/reserved_fixed_ips/{project_id}/{region_id}/{port_id}", + project_id=project_id, + region_id=region_id, + port_id=port_id, + ), body=await async_maybe_transform({"is_vip": is_vip}, vip_toggle_params.VipToggleParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gcore/resources/cloud/secrets.py b/src/gcore/resources/cloud/secrets.py index 9895c974..e8c06164 100644 --- a/src/gcore/resources/cloud/secrets.py +++ b/src/gcore/resources/cloud/secrets.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -90,7 +90,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/secrets/{project_id}/{region_id}", + path_template("/cloud/v1/secrets/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=SyncOffsetPage[Secret], options=make_request_options( extra_headers=extra_headers, @@ -146,7 +146,12 @@ def delete( if not secret_id: raise ValueError(f"Expected a non-empty value for `secret_id` but received {secret_id!r}") return self._delete( - f"/cloud/v1/secrets/{project_id}/{region_id}/{secret_id}", + path_template( + "/cloud/v1/secrets/{project_id}/{region_id}/{secret_id}", + project_id=project_id, + region_id=region_id, + secret_id=secret_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -191,7 +196,12 @@ def get( if not secret_id: raise ValueError(f"Expected a non-empty value for `secret_id` but received {secret_id!r}") return self._get( - f"/cloud/v1/secrets/{project_id}/{region_id}/{secret_id}", + path_template( + "/cloud/v1/secrets/{project_id}/{region_id}/{secret_id}", + project_id=project_id, + region_id=region_id, + secret_id=secret_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -240,7 +250,7 @@ def upload_tls_certificate( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v2/secrets/{project_id}/{region_id}", + path_template("/cloud/v2/secrets/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "name": name, @@ -363,7 +373,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/secrets/{project_id}/{region_id}", + path_template("/cloud/v1/secrets/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=AsyncOffsetPage[Secret], options=make_request_options( extra_headers=extra_headers, @@ -419,7 +429,12 @@ async def delete( if not secret_id: raise ValueError(f"Expected a non-empty value for `secret_id` but received {secret_id!r}") return await self._delete( - f"/cloud/v1/secrets/{project_id}/{region_id}/{secret_id}", + path_template( + "/cloud/v1/secrets/{project_id}/{region_id}/{secret_id}", + project_id=project_id, + region_id=region_id, + secret_id=secret_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -464,7 +479,12 @@ async def get( if not secret_id: raise ValueError(f"Expected a non-empty value for `secret_id` but received {secret_id!r}") return await self._get( - f"/cloud/v1/secrets/{project_id}/{region_id}/{secret_id}", + path_template( + "/cloud/v1/secrets/{project_id}/{region_id}/{secret_id}", + project_id=project_id, + region_id=region_id, + secret_id=secret_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -513,7 +533,7 @@ async def upload_tls_certificate( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v2/secrets/{project_id}/{region_id}", + path_template("/cloud/v2/secrets/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "name": name, diff --git a/src/gcore/resources/cloud/security_groups/rules.py b/src/gcore/resources/cloud/security_groups/rules.py index 925ffac4..9fba7c36 100644 --- a/src/gcore/resources/cloud/security_groups/rules.py +++ b/src/gcore/resources/cloud/security_groups/rules.py @@ -9,7 +9,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -140,7 +140,12 @@ def create( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return self._post( - f"/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}/rules", + path_template( + "/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}/rules", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), body=maybe_transform( { "direction": direction, @@ -205,7 +210,13 @@ def delete( if not rule_id: raise ValueError(f"Expected a non-empty value for `rule_id` but received {rule_id!r}") return self._delete( - f"/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}/rules/{rule_id}", + path_template( + "/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}/rules/{rule_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + rule_id=rule_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -311,7 +322,12 @@ def replace( if not rule_id: raise ValueError(f"Expected a non-empty value for `rule_id` but received {rule_id!r}") return self._put( - f"/cloud/v1/securitygrouprules/{project_id}/{region_id}/{rule_id}", + path_template( + "/cloud/v1/securitygrouprules/{project_id}/{region_id}/{rule_id}", + project_id=project_id, + region_id=region_id, + rule_id=rule_id, + ), body=maybe_transform( { "direction": direction, @@ -585,7 +601,12 @@ async def create( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return await self._post( - f"/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}/rules", + path_template( + "/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}/rules", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), body=await async_maybe_transform( { "direction": direction, @@ -650,7 +671,13 @@ async def delete( if not rule_id: raise ValueError(f"Expected a non-empty value for `rule_id` but received {rule_id!r}") return await self._delete( - f"/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}/rules/{rule_id}", + path_template( + "/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}/rules/{rule_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + rule_id=rule_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -756,7 +783,12 @@ async def replace( if not rule_id: raise ValueError(f"Expected a non-empty value for `rule_id` but received {rule_id!r}") return await self._put( - f"/cloud/v1/securitygrouprules/{project_id}/{region_id}/{rule_id}", + path_template( + "/cloud/v1/securitygrouprules/{project_id}/{region_id}/{rule_id}", + project_id=project_id, + region_id=region_id, + rule_id=rule_id, + ), body=await async_maybe_transform( { "direction": direction, diff --git a/src/gcore/resources/cloud/security_groups/security_groups.py b/src/gcore/resources/cloud/security_groups/security_groups.py index 51519595..13d3d493 100644 --- a/src/gcore/resources/cloud/security_groups/security_groups.py +++ b/src/gcore/resources/cloud/security_groups/security_groups.py @@ -15,7 +15,7 @@ AsyncRulesResourceWithStreamingResponse, ) from ...._types import NOT_GIVEN, Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -123,7 +123,9 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v2/security_groups/{project_id}/{region_id}", + path_template( + "/cloud/v2/security_groups/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=maybe_transform( { "name": name, @@ -227,7 +229,12 @@ def update( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return self._patch( - f"/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}", + path_template( + "/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), body=maybe_transform( { "description": description, @@ -291,7 +298,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/securitygroups/{project_id}/{region_id}", + path_template( + "/cloud/v1/securitygroups/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), page=SyncOffsetPage[SecurityGroup], options=make_request_options( extra_headers=extra_headers, @@ -351,7 +360,12 @@ def delete( raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}", + path_template( + "/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -399,7 +413,12 @@ def copy( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return self._post( - f"/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}/copy", + path_template( + "/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}/copy", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), body=maybe_transform({"name": name}, security_group_copy_params.SecurityGroupCopyParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -445,7 +464,12 @@ def get( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return self._get( - f"/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}", + path_template( + "/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -490,7 +514,12 @@ def revert_to_default( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return self._post( - f"/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}/revert", + path_template( + "/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}/revert", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -688,7 +717,9 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v2/security_groups/{project_id}/{region_id}", + path_template( + "/cloud/v2/security_groups/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), body=await async_maybe_transform( { "name": name, @@ -792,7 +823,12 @@ async def update( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return await self._patch( - f"/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}", + path_template( + "/cloud/v2/security_groups/{project_id}/{region_id}/{group_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), body=await async_maybe_transform( { "description": description, @@ -856,7 +892,9 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/securitygroups/{project_id}/{region_id}", + path_template( + "/cloud/v1/securitygroups/{project_id}/{region_id}", project_id=project_id, region_id=region_id + ), page=AsyncOffsetPage[SecurityGroup], options=make_request_options( extra_headers=extra_headers, @@ -916,7 +954,12 @@ async def delete( raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}", + path_template( + "/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -964,7 +1007,12 @@ async def copy( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return await self._post( - f"/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}/copy", + path_template( + "/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}/copy", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), body=await async_maybe_transform({"name": name}, security_group_copy_params.SecurityGroupCopyParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -1010,7 +1058,12 @@ async def get( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return await self._get( - f"/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}", + path_template( + "/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1055,7 +1108,12 @@ async def revert_to_default( if not group_id: raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}") return await self._post( - f"/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}/revert", + path_template( + "/cloud/v1/securitygroups/{project_id}/{region_id}/{group_id}/revert", + project_id=project_id, + region_id=region_id, + group_id=group_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/ssh_keys.py b/src/gcore/resources/cloud/ssh_keys.py index 59219d70..161642e0 100644 --- a/src/gcore/resources/cloud/ssh_keys.py +++ b/src/gcore/resources/cloud/ssh_keys.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -94,7 +94,7 @@ def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._post( - f"/cloud/v1/ssh_keys/{project_id}", + path_template("/cloud/v1/ssh_keys/{project_id}", project_id=project_id), body=maybe_transform( { "name": name, @@ -145,7 +145,7 @@ def update( if not ssh_key_id: raise ValueError(f"Expected a non-empty value for `ssh_key_id` but received {ssh_key_id!r}") return self._patch( - f"/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", + path_template("/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", project_id=project_id, ssh_key_id=ssh_key_id), body=maybe_transform({"shared_in_project": shared_in_project}, ssh_key_update_params.SSHKeyUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -194,7 +194,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get_api_list( - f"/cloud/v1/ssh_keys/{project_id}", + path_template("/cloud/v1/ssh_keys/{project_id}", project_id=project_id), page=SyncOffsetPage[SSHKey], options=make_request_options( extra_headers=extra_headers, @@ -248,7 +248,7 @@ def delete( raise ValueError(f"Expected a non-empty value for `ssh_key_id` but received {ssh_key_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", + path_template("/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", project_id=project_id, ssh_key_id=ssh_key_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -288,7 +288,7 @@ def get( if not ssh_key_id: raise ValueError(f"Expected a non-empty value for `ssh_key_id` but received {ssh_key_id!r}") return self._get( - f"/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", + path_template("/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", project_id=project_id, ssh_key_id=ssh_key_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -365,7 +365,7 @@ async def create( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return await self._post( - f"/cloud/v1/ssh_keys/{project_id}", + path_template("/cloud/v1/ssh_keys/{project_id}", project_id=project_id), body=await async_maybe_transform( { "name": name, @@ -416,7 +416,7 @@ async def update( if not ssh_key_id: raise ValueError(f"Expected a non-empty value for `ssh_key_id` but received {ssh_key_id!r}") return await self._patch( - f"/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", + path_template("/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", project_id=project_id, ssh_key_id=ssh_key_id), body=await async_maybe_transform( {"shared_in_project": shared_in_project}, ssh_key_update_params.SSHKeyUpdateParams ), @@ -467,7 +467,7 @@ def list( if project_id is None: project_id = self._client._get_cloud_project_id_path_param() return self._get_api_list( - f"/cloud/v1/ssh_keys/{project_id}", + path_template("/cloud/v1/ssh_keys/{project_id}", project_id=project_id), page=AsyncOffsetPage[SSHKey], options=make_request_options( extra_headers=extra_headers, @@ -521,7 +521,7 @@ async def delete( raise ValueError(f"Expected a non-empty value for `ssh_key_id` but received {ssh_key_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", + path_template("/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", project_id=project_id, ssh_key_id=ssh_key_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -561,7 +561,7 @@ async def get( if not ssh_key_id: raise ValueError(f"Expected a non-empty value for `ssh_key_id` but received {ssh_key_id!r}") return await self._get( - f"/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", + path_template("/cloud/v1/ssh_keys/{project_id}/{ssh_key_id}", project_id=project_id, ssh_key_id=ssh_key_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/tasks.py b/src/gcore/resources/cloud/tasks.py index cead4247..42121e2c 100644 --- a/src/gcore/resources/cloud/tasks.py +++ b/src/gcore/resources/cloud/tasks.py @@ -10,7 +10,7 @@ import httpx from ..._types import NOT_GIVEN, Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import is_given, maybe_transform, async_maybe_transform +from ..._utils import is_given, path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -304,7 +304,7 @@ def acknowledge_one( if not task_id: raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}") return self._post( - f"/cloud/v1/tasks/{task_id}/acknowledge", + path_template("/cloud/v1/tasks/{task_id}/acknowledge", task_id=task_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -339,7 +339,7 @@ def get( if not task_id: raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}") return self._get( - f"/cloud/v1/tasks/{task_id}", + path_template("/cloud/v1/tasks/{task_id}", task_id=task_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -624,7 +624,7 @@ async def acknowledge_one( if not task_id: raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}") return await self._post( - f"/cloud/v1/tasks/{task_id}/acknowledge", + path_template("/cloud/v1/tasks/{task_id}/acknowledge", task_id=task_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -659,7 +659,7 @@ async def get( if not task_id: raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}") return await self._get( - f"/cloud/v1/tasks/{task_id}", + path_template("/cloud/v1/tasks/{task_id}", task_id=task_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/users/role_assignments.py b/src/gcore/resources/cloud/users/role_assignments.py index db6f6bd4..82fcb059 100644 --- a/src/gcore/resources/cloud/users/role_assignments.py +++ b/src/gcore/resources/cloud/users/role_assignments.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -139,7 +139,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/cloud/v1/users/assignments/{assignment_id}", + path_template("/cloud/v1/users/assignments/{assignment_id}", assignment_id=assignment_id), body=maybe_transform( { "role": role, @@ -237,7 +237,7 @@ def delete( timeout: Override the client-level default timeout for this request, in seconds """ return self._delete( - f"/cloud/v1/users/assignments/{assignment_id}", + path_template("/cloud/v1/users/assignments/{assignment_id}", assignment_id=assignment_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -354,7 +354,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/cloud/v1/users/assignments/{assignment_id}", + path_template("/cloud/v1/users/assignments/{assignment_id}", assignment_id=assignment_id), body=await async_maybe_transform( { "role": role, @@ -452,7 +452,7 @@ async def delete( timeout: Override the client-level default timeout for this request, in seconds """ return await self._delete( - f"/cloud/v1/users/assignments/{assignment_id}", + path_template("/cloud/v1/users/assignments/{assignment_id}", assignment_id=assignment_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/volume_snapshots.py b/src/gcore/resources/cloud/volume_snapshots.py index a8b6850a..9e38f471 100644 --- a/src/gcore/resources/cloud/volume_snapshots.py +++ b/src/gcore/resources/cloud/volume_snapshots.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -91,7 +91,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/snapshots/{project_id}/{region_id}", + path_template("/cloud/v1/snapshots/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "name": name, @@ -172,7 +172,12 @@ def update( if not snapshot_id: raise ValueError(f"Expected a non-empty value for `snapshot_id` but received {snapshot_id!r}") return self._patch( - f"/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + path_template( + "/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + project_id=project_id, + region_id=region_id, + snapshot_id=snapshot_id, + ), body=maybe_transform( { "name": name, @@ -224,7 +229,12 @@ def delete( if not snapshot_id: raise ValueError(f"Expected a non-empty value for `snapshot_id` but received {snapshot_id!r}") return self._delete( - f"/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + path_template( + "/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + project_id=project_id, + region_id=region_id, + snapshot_id=snapshot_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -269,7 +279,12 @@ def get( if not snapshot_id: raise ValueError(f"Expected a non-empty value for `snapshot_id` but received {snapshot_id!r}") return self._get( - f"/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + path_template( + "/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + project_id=project_id, + region_id=region_id, + snapshot_id=snapshot_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -343,7 +358,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/snapshots/{project_id}/{region_id}", + path_template("/cloud/v1/snapshots/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "name": name, @@ -424,7 +439,12 @@ async def update( if not snapshot_id: raise ValueError(f"Expected a non-empty value for `snapshot_id` but received {snapshot_id!r}") return await self._patch( - f"/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + path_template( + "/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + project_id=project_id, + region_id=region_id, + snapshot_id=snapshot_id, + ), body=await async_maybe_transform( { "name": name, @@ -476,7 +496,12 @@ async def delete( if not snapshot_id: raise ValueError(f"Expected a non-empty value for `snapshot_id` but received {snapshot_id!r}") return await self._delete( - f"/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + path_template( + "/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + project_id=project_id, + region_id=region_id, + snapshot_id=snapshot_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -521,7 +546,12 @@ async def get( if not snapshot_id: raise ValueError(f"Expected a non-empty value for `snapshot_id` but received {snapshot_id!r}") return await self._get( - f"/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + path_template( + "/cloud/v1/snapshots/{project_id}/{region_id}/{snapshot_id}", + project_id=project_id, + region_id=region_id, + snapshot_id=snapshot_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/cloud/volumes.py b/src/gcore/resources/cloud/volumes.py index e45ca1b0..2d96c3e9 100644 --- a/src/gcore/resources/cloud/volumes.py +++ b/src/gcore/resources/cloud/volumes.py @@ -8,7 +8,7 @@ import httpx from ..._types import NOT_GIVEN, Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import required_args, maybe_transform, async_maybe_transform +from ..._utils import path_template, required_args, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -295,7 +295,7 @@ def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._post( - f"/cloud/v1/volumes/{project_id}/{region_id}", + path_template("/cloud/v1/volumes/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=maybe_transform( { "image_id": image_id, @@ -381,7 +381,12 @@ def update( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._patch( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), body=maybe_transform( { "name": name, @@ -463,7 +468,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/volumes/{project_id}/{region_id}", + path_template("/cloud/v1/volumes/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=SyncOffsetPage[Volume], options=make_request_options( extra_headers=extra_headers, @@ -532,7 +537,12 @@ def delete( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._delete( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -589,7 +599,12 @@ def attach_to_instance( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._post( - f"/cloud/v2/volumes/{project_id}/{region_id}/{volume_id}/attach", + path_template( + "/cloud/v2/volumes/{project_id}/{region_id}/{volume_id}/attach", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), body=maybe_transform( { "instance_id": instance_id, @@ -646,7 +661,12 @@ def change_type( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._post( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/retype", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/retype", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), body=maybe_transform({"volume_type": volume_type}, volume_change_type_params.VolumeChangeTypeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -695,7 +715,12 @@ def detach_from_instance( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._post( - f"/cloud/v2/volumes/{project_id}/{region_id}/{volume_id}/detach", + path_template( + "/cloud/v2/volumes/{project_id}/{region_id}/{volume_id}/detach", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), body=maybe_transform( {"instance_id": instance_id}, volume_detach_from_instance_params.VolumeDetachFromInstanceParams ), @@ -743,7 +768,12 @@ def get( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._get( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -793,7 +823,12 @@ def resize( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._post( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/extend", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/extend", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), body=maybe_transform({"size": size}, volume_resize_params.VolumeResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -842,7 +877,12 @@ def revert_to_last_snapshot( raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/revert", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/revert", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1543,7 +1583,7 @@ async def create( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return await self._post( - f"/cloud/v1/volumes/{project_id}/{region_id}", + path_template("/cloud/v1/volumes/{project_id}/{region_id}", project_id=project_id, region_id=region_id), body=await async_maybe_transform( { "image_id": image_id, @@ -1629,7 +1669,12 @@ async def update( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._patch( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), body=await async_maybe_transform( { "name": name, @@ -1711,7 +1756,7 @@ def list( if region_id is None: region_id = self._client._get_cloud_region_id_path_param() return self._get_api_list( - f"/cloud/v1/volumes/{project_id}/{region_id}", + path_template("/cloud/v1/volumes/{project_id}/{region_id}", project_id=project_id, region_id=region_id), page=AsyncOffsetPage[Volume], options=make_request_options( extra_headers=extra_headers, @@ -1780,7 +1825,12 @@ async def delete( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._delete( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1837,7 +1887,12 @@ async def attach_to_instance( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._post( - f"/cloud/v2/volumes/{project_id}/{region_id}/{volume_id}/attach", + path_template( + "/cloud/v2/volumes/{project_id}/{region_id}/{volume_id}/attach", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), body=await async_maybe_transform( { "instance_id": instance_id, @@ -1894,7 +1949,12 @@ async def change_type( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._post( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/retype", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/retype", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), body=await async_maybe_transform( {"volume_type": volume_type}, volume_change_type_params.VolumeChangeTypeParams ), @@ -1945,7 +2005,12 @@ async def detach_from_instance( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._post( - f"/cloud/v2/volumes/{project_id}/{region_id}/{volume_id}/detach", + path_template( + "/cloud/v2/volumes/{project_id}/{region_id}/{volume_id}/detach", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), body=await async_maybe_transform( {"instance_id": instance_id}, volume_detach_from_instance_params.VolumeDetachFromInstanceParams ), @@ -1993,7 +2058,12 @@ async def get( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._get( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -2043,7 +2113,12 @@ async def resize( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._post( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/extend", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/extend", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), body=await async_maybe_transform({"size": size}, volume_resize_params.VolumeResizeParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -2092,7 +2167,12 @@ async def revert_to_last_snapshot( raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/revert", + path_template( + "/cloud/v1/volumes/{project_id}/{region_id}/{volume_id}/revert", + project_id=project_id, + region_id=region_id, + volume_id=volume_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/dns/network_mappings.py b/src/gcore/resources/dns/network_mappings.py index b17c7c7b..567435c6 100644 --- a/src/gcore/resources/dns/network_mappings.py +++ b/src/gcore/resources/dns/network_mappings.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -218,7 +218,7 @@ def delete( timeout: Override the client-level default timeout for this request, in seconds """ return self._delete( - f"/dns/v2/network-mappings/{id}", + path_template("/dns/v2/network-mappings/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -256,7 +256,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/dns/v2/network-mappings/{id}", + path_template("/dns/v2/network-mappings/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -298,7 +298,7 @@ def get_by_name( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return self._get( - f"/dns/v2/network-mappings/{name}", + path_template("/dns/v2/network-mappings/{name}", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -447,7 +447,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/dns/v2/network-mappings/{id}", + path_template("/dns/v2/network-mappings/{id}", id=id), body=maybe_transform( { "mapping": mapping, @@ -652,7 +652,7 @@ async def delete( timeout: Override the client-level default timeout for this request, in seconds """ return await self._delete( - f"/dns/v2/network-mappings/{id}", + path_template("/dns/v2/network-mappings/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -690,7 +690,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/dns/v2/network-mappings/{id}", + path_template("/dns/v2/network-mappings/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -732,7 +732,7 @@ async def get_by_name( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return await self._get( - f"/dns/v2/network-mappings/{name}", + path_template("/dns/v2/network-mappings/{name}", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -881,7 +881,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/dns/v2/network-mappings/{id}", + path_template("/dns/v2/network-mappings/{id}", id=id), body=await async_maybe_transform( { "mapping": mapping, diff --git a/src/gcore/resources/dns/zones/dnssec.py b/src/gcore/resources/dns/zones/dnssec.py index e91a9d09..a4b8f86d 100644 --- a/src/gcore/resources/dns/zones/dnssec.py +++ b/src/gcore/resources/dns/zones/dnssec.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -69,7 +69,7 @@ def update( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return self._patch( - f"/dns/v2/zones/{name}/dnssec", + path_template("/dns/v2/zones/{name}/dnssec", name=name), body=maybe_transform({"enabled": enabled}, dnssec_update_params.DnssecUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -103,7 +103,7 @@ def get( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return self._get( - f"/dns/v2/zones/{name}/dnssec", + path_template("/dns/v2/zones/{name}/dnssec", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -158,7 +158,7 @@ async def update( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return await self._patch( - f"/dns/v2/zones/{name}/dnssec", + path_template("/dns/v2/zones/{name}/dnssec", name=name), body=await async_maybe_transform({"enabled": enabled}, dnssec_update_params.DnssecUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -192,7 +192,7 @@ async def get( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return await self._get( - f"/dns/v2/zones/{name}/dnssec", + path_template("/dns/v2/zones/{name}/dnssec", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/dns/zones/rrsets.py b/src/gcore/resources/dns/zones/rrsets.py index 9871c267..0f8be984 100644 --- a/src/gcore/resources/dns/zones/rrsets.py +++ b/src/gcore/resources/dns/zones/rrsets.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -201,7 +201,12 @@ def create( if not rrset_type: raise ValueError(f"Expected a non-empty value for `rrset_type` but received {rrset_type!r}") return self._post( - f"/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + path_template( + "/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + zone_name=zone_name, + rrset_name=rrset_name, + rrset_type=rrset_type, + ), body=maybe_transform( { "resource_records": resource_records, @@ -255,7 +260,7 @@ def list( if not zone_name: raise ValueError(f"Expected a non-empty value for `zone_name` but received {zone_name!r}") return self._get( - f"/dns/v2/zones/{zone_name}/rrsets", + path_template("/dns/v2/zones/{zone_name}/rrsets", zone_name=zone_name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -306,7 +311,12 @@ def delete( if not rrset_type: raise ValueError(f"Expected a non-empty value for `rrset_type` but received {rrset_type!r}") return self._delete( - f"/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + path_template( + "/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + zone_name=zone_name, + rrset_name=rrset_name, + rrset_type=rrset_type, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -345,7 +355,12 @@ def get( if not rrset_type: raise ValueError(f"Expected a non-empty value for `rrset_type` but received {rrset_type!r}") return self._get( - f"/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + path_template( + "/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + zone_name=zone_name, + rrset_name=rrset_name, + rrset_type=rrset_type, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -390,7 +405,12 @@ def get_failover_logs( if not rrset_type: raise ValueError(f"Expected a non-empty value for `rrset_type` but received {rrset_type!r}") return self._get( - f"/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}/failover/log", + path_template( + "/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}/failover/log", + zone_name=zone_name, + rrset_name=rrset_name, + rrset_type=rrset_type, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -449,7 +469,12 @@ def replace( if not rrset_type: raise ValueError(f"Expected a non-empty value for `rrset_type` but received {rrset_type!r}") return self._put( - f"/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + path_template( + "/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + zone_name=zone_name, + rrset_name=rrset_name, + rrset_type=rrset_type, + ), body=maybe_transform( { "resource_records": resource_records, @@ -636,7 +661,12 @@ async def create( if not rrset_type: raise ValueError(f"Expected a non-empty value for `rrset_type` but received {rrset_type!r}") return await self._post( - f"/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + path_template( + "/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + zone_name=zone_name, + rrset_name=rrset_name, + rrset_type=rrset_type, + ), body=await async_maybe_transform( { "resource_records": resource_records, @@ -690,7 +720,7 @@ async def list( if not zone_name: raise ValueError(f"Expected a non-empty value for `zone_name` but received {zone_name!r}") return await self._get( - f"/dns/v2/zones/{zone_name}/rrsets", + path_template("/dns/v2/zones/{zone_name}/rrsets", zone_name=zone_name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -741,7 +771,12 @@ async def delete( if not rrset_type: raise ValueError(f"Expected a non-empty value for `rrset_type` but received {rrset_type!r}") return await self._delete( - f"/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + path_template( + "/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + zone_name=zone_name, + rrset_name=rrset_name, + rrset_type=rrset_type, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -780,7 +815,12 @@ async def get( if not rrset_type: raise ValueError(f"Expected a non-empty value for `rrset_type` but received {rrset_type!r}") return await self._get( - f"/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + path_template( + "/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + zone_name=zone_name, + rrset_name=rrset_name, + rrset_type=rrset_type, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -825,7 +865,12 @@ async def get_failover_logs( if not rrset_type: raise ValueError(f"Expected a non-empty value for `rrset_type` but received {rrset_type!r}") return await self._get( - f"/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}/failover/log", + path_template( + "/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}/failover/log", + zone_name=zone_name, + rrset_name=rrset_name, + rrset_type=rrset_type, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -884,7 +929,12 @@ async def replace( if not rrset_type: raise ValueError(f"Expected a non-empty value for `rrset_type` but received {rrset_type!r}") return await self._put( - f"/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + path_template( + "/dns/v2/zones/{zone_name}/{rrset_name}/{rrset_type}", + zone_name=zone_name, + rrset_name=rrset_name, + rrset_type=rrset_type, + ), body=await async_maybe_transform( { "resource_records": resource_records, diff --git a/src/gcore/resources/dns/zones/zones.py b/src/gcore/resources/dns/zones/zones.py index 65872318..75511028 100644 --- a/src/gcore/resources/dns/zones/zones.py +++ b/src/gcore/resources/dns/zones/zones.py @@ -25,7 +25,7 @@ AsyncRrsetsResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -290,7 +290,7 @@ def delete( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return self._delete( - f"/dns/v2/zones/{name}", + path_template("/dns/v2/zones/{name}", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -325,7 +325,7 @@ def check_delegation_status( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return self._get( - f"/dns/v2/analyze/{name}/delegation-status", + path_template("/dns/v2/analyze/{name}/delegation-status", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -358,7 +358,7 @@ def disable( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return self._patch( - f"/dns/v2/zones/{name}/disable", + path_template("/dns/v2/zones/{name}/disable", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -391,7 +391,7 @@ def enable( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return self._patch( - f"/dns/v2/zones/{name}/enable", + path_template("/dns/v2/zones/{name}/enable", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -424,7 +424,7 @@ def export( if not zone_name: raise ValueError(f"Expected a non-empty value for `zone_name` but received {zone_name!r}") return self._get( - f"/dns/v2/zones/{zone_name}/export", + path_template("/dns/v2/zones/{zone_name}/export", zone_name=zone_name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -457,7 +457,7 @@ def get( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return self._get( - f"/dns/v2/zones/{name}", + path_template("/dns/v2/zones/{name}", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -528,7 +528,7 @@ def get_statistics( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return self._get( - f"/dns/v2/zones/{name}/statistics", + path_template("/dns/v2/zones/{name}/statistics", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -601,7 +601,7 @@ def import_( if not zone_name: raise ValueError(f"Expected a non-empty value for `zone_name` but received {zone_name!r}") return self._post( - f"/dns/v2/zones/{zone_name}/import", + path_template("/dns/v2/zones/{zone_name}/import", zone_name=zone_name), body=maybe_transform(body, zone_import_params.ZoneImportParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -674,7 +674,7 @@ def replace( if not path_name: raise ValueError(f"Expected a non-empty value for `path_name` but received {path_name!r}") return self._put( - f"/dns/v2/zones/{path_name}", + path_template("/dns/v2/zones/{path_name}", path_name=path_name), body=maybe_transform( { "body_name": body_name, @@ -934,7 +934,7 @@ async def delete( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return await self._delete( - f"/dns/v2/zones/{name}", + path_template("/dns/v2/zones/{name}", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -969,7 +969,7 @@ async def check_delegation_status( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return await self._get( - f"/dns/v2/analyze/{name}/delegation-status", + path_template("/dns/v2/analyze/{name}/delegation-status", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1002,7 +1002,7 @@ async def disable( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return await self._patch( - f"/dns/v2/zones/{name}/disable", + path_template("/dns/v2/zones/{name}/disable", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1035,7 +1035,7 @@ async def enable( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return await self._patch( - f"/dns/v2/zones/{name}/enable", + path_template("/dns/v2/zones/{name}/enable", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1068,7 +1068,7 @@ async def export( if not zone_name: raise ValueError(f"Expected a non-empty value for `zone_name` but received {zone_name!r}") return await self._get( - f"/dns/v2/zones/{zone_name}/export", + path_template("/dns/v2/zones/{zone_name}/export", zone_name=zone_name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1101,7 +1101,7 @@ async def get( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return await self._get( - f"/dns/v2/zones/{name}", + path_template("/dns/v2/zones/{name}", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1172,7 +1172,7 @@ async def get_statistics( if not name: raise ValueError(f"Expected a non-empty value for `name` but received {name!r}") return await self._get( - f"/dns/v2/zones/{name}/statistics", + path_template("/dns/v2/zones/{name}/statistics", name=name), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1245,7 +1245,7 @@ async def import_( if not zone_name: raise ValueError(f"Expected a non-empty value for `zone_name` but received {zone_name!r}") return await self._post( - f"/dns/v2/zones/{zone_name}/import", + path_template("/dns/v2/zones/{zone_name}/import", zone_name=zone_name), body=await async_maybe_transform(body, zone_import_params.ZoneImportParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -1318,7 +1318,7 @@ async def replace( if not path_name: raise ValueError(f"Expected a non-empty value for `path_name` but received {path_name!r}") return await self._put( - f"/dns/v2/zones/{path_name}", + path_template("/dns/v2/zones/{path_name}", path_name=path_name), body=await async_maybe_transform( { "body_name": body_name, diff --git a/src/gcore/resources/fastedge/apps/apps.py b/src/gcore/resources/fastedge/apps/apps.py index c69b0cc2..2d8a8d44 100644 --- a/src/gcore/resources/fastedge/apps/apps.py +++ b/src/gcore/resources/fastedge/apps/apps.py @@ -16,7 +16,7 @@ AsyncLogsResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -220,7 +220,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/fastedge/v1/apps/{app_id}", + path_template("/fastedge/v1/apps/{app_id}", app_id=app_id), body=maybe_transform( { "binary": binary, @@ -371,7 +371,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/fastedge/v1/apps/{app_id}", + path_template("/fastedge/v1/apps/{app_id}", app_id=app_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -404,7 +404,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/fastedge/v1/apps/{app_id}", + path_template("/fastedge/v1/apps/{app_id}", app_id=app_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -438,7 +438,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/fastedge/v1/apps/{app_id}", + path_template("/fastedge/v1/apps/{app_id}", app_id=app_id), body=maybe_transform(body, app_replace_params.AppReplaceParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -633,7 +633,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/fastedge/v1/apps/{app_id}", + path_template("/fastedge/v1/apps/{app_id}", app_id=app_id), body=await async_maybe_transform( { "binary": binary, @@ -784,7 +784,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/fastedge/v1/apps/{app_id}", + path_template("/fastedge/v1/apps/{app_id}", app_id=app_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -817,7 +817,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/fastedge/v1/apps/{app_id}", + path_template("/fastedge/v1/apps/{app_id}", app_id=app_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -851,7 +851,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/fastedge/v1/apps/{app_id}", + path_template("/fastedge/v1/apps/{app_id}", app_id=app_id), body=await async_maybe_transform(body, app_replace_params.AppReplaceParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gcore/resources/fastedge/apps/logs.py b/src/gcore/resources/fastedge/apps/logs.py index a5670a04..592b136a 100644 --- a/src/gcore/resources/fastedge/apps/logs.py +++ b/src/gcore/resources/fastedge/apps/logs.py @@ -9,7 +9,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform +from ...._utils import path_template, maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -99,7 +99,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/fastedge/v1/apps/{app_id}/logs", + path_template("/fastedge/v1/apps/{app_id}/logs", app_id=app_id), page=SyncOffsetPageFastedgeAppLogs[Log], options=make_request_options( extra_headers=extra_headers, @@ -197,7 +197,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/fastedge/v1/apps/{app_id}/logs", + path_template("/fastedge/v1/apps/{app_id}/logs", app_id=app_id), page=AsyncOffsetPageFastedgeAppLogs[Log], options=make_request_options( extra_headers=extra_headers, diff --git a/src/gcore/resources/fastedge/binaries.py b/src/gcore/resources/fastedge/binaries.py index 9d20dca6..84197af3 100644 --- a/src/gcore/resources/fastedge/binaries.py +++ b/src/gcore/resources/fastedge/binaries.py @@ -18,6 +18,7 @@ AsyncBinaryTypes, not_given, ) +from ..._utils import path_template from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -145,7 +146,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/fastedge/v1/binaries/{binary_id}", + path_template("/fastedge/v1/binaries/{binary_id}", binary_id=binary_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -178,7 +179,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/fastedge/v1/binaries/{binary_id}", + path_template("/fastedge/v1/binaries/{binary_id}", binary_id=binary_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -297,7 +298,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/fastedge/v1/binaries/{binary_id}", + path_template("/fastedge/v1/binaries/{binary_id}", binary_id=binary_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -330,7 +331,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/fastedge/v1/binaries/{binary_id}", + path_template("/fastedge/v1/binaries/{binary_id}", binary_id=binary_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/fastedge/kv_stores.py b/src/gcore/resources/fastedge/kv_stores.py index daa1bbe0..0ddaeda5 100644 --- a/src/gcore/resources/fastedge/kv_stores.py +++ b/src/gcore/resources/fastedge/kv_stores.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -173,7 +173,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/fastedge/v1/kv/{store_id}", + path_template("/fastedge/v1/kv/{store_id}", store_id=store_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -205,7 +205,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/fastedge/v1/kv/{store_id}", + path_template("/fastedge/v1/kv/{store_id}", store_id=store_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -246,7 +246,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/fastedge/v1/kv/{store_id}", + path_template("/fastedge/v1/kv/{store_id}", store_id=store_id), body=maybe_transform( { "name": name, @@ -412,7 +412,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/fastedge/v1/kv/{store_id}", + path_template("/fastedge/v1/kv/{store_id}", store_id=store_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -444,7 +444,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/fastedge/v1/kv/{store_id}", + path_template("/fastedge/v1/kv/{store_id}", store_id=store_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -485,7 +485,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/fastedge/v1/kv/{store_id}", + path_template("/fastedge/v1/kv/{store_id}", store_id=store_id), body=await async_maybe_transform( { "name": name, diff --git a/src/gcore/resources/fastedge/secrets.py b/src/gcore/resources/fastedge/secrets.py index 5c37058c..8fa21386 100644 --- a/src/gcore/resources/fastedge/secrets.py +++ b/src/gcore/resources/fastedge/secrets.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -137,7 +137,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/fastedge/v1/secrets/{secret_id}", + path_template("/fastedge/v1/secrets/{secret_id}", secret_id=secret_id), body=maybe_transform( { "comment": comment, @@ -230,7 +230,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/fastedge/v1/secrets/{secret_id}", + path_template("/fastedge/v1/secrets/{secret_id}", secret_id=secret_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -267,7 +267,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/fastedge/v1/secrets/{secret_id}", + path_template("/fastedge/v1/secrets/{secret_id}", secret_id=secret_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -307,7 +307,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/fastedge/v1/secrets/{secret_id}", + path_template("/fastedge/v1/secrets/{secret_id}", secret_id=secret_id), body=maybe_transform( { "name": name, @@ -429,7 +429,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/fastedge/v1/secrets/{secret_id}", + path_template("/fastedge/v1/secrets/{secret_id}", secret_id=secret_id), body=await async_maybe_transform( { "comment": comment, @@ -522,7 +522,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/fastedge/v1/secrets/{secret_id}", + path_template("/fastedge/v1/secrets/{secret_id}", secret_id=secret_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -559,7 +559,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/fastedge/v1/secrets/{secret_id}", + path_template("/fastedge/v1/secrets/{secret_id}", secret_id=secret_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -599,7 +599,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/fastedge/v1/secrets/{secret_id}", + path_template("/fastedge/v1/secrets/{secret_id}", secret_id=secret_id), body=await async_maybe_transform( { "name": name, diff --git a/src/gcore/resources/fastedge/templates.py b/src/gcore/resources/fastedge/templates.py index 3c9a4689..a8b56092 100644 --- a/src/gcore/resources/fastedge/templates.py +++ b/src/gcore/resources/fastedge/templates.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -206,7 +206,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/fastedge/v1/template/{template_id}", + path_template("/fastedge/v1/template/{template_id}", template_id=template_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -243,7 +243,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/fastedge/v1/template/{template_id}", + path_template("/fastedge/v1/template/{template_id}", template_id=template_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -294,7 +294,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/fastedge/v1/template/{template_id}", + path_template("/fastedge/v1/template/{template_id}", template_id=template_id), body=maybe_transform( { "binary_id": binary_id, @@ -487,7 +487,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/fastedge/v1/template/{template_id}", + path_template("/fastedge/v1/template/{template_id}", template_id=template_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -524,7 +524,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/fastedge/v1/template/{template_id}", + path_template("/fastedge/v1/template/{template_id}", template_id=template_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -575,7 +575,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/fastedge/v1/template/{template_id}", + path_template("/fastedge/v1/template/{template_id}", template_id=template_id), body=await async_maybe_transform( { "binary_id": binary_id, diff --git a/src/gcore/resources/iam/api_tokens.py b/src/gcore/resources/iam/api_tokens.py index 062e086c..2ff21397 100644 --- a/src/gcore/resources/iam/api_tokens.py +++ b/src/gcore/resources/iam/api_tokens.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -97,7 +97,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/iam/clients/{client_id}/tokens", + path_template("/iam/clients/{client_id}/tokens", client_id=client_id), body=maybe_transform( { "client_user": client_user, @@ -164,7 +164,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/iam/clients/{client_id}/tokens", + path_template("/iam/clients/{client_id}/tokens", client_id=client_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -213,7 +213,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/iam/clients/{client_id}/tokens/{token_id}", + path_template("/iam/clients/{client_id}/tokens/{token_id}", client_id=client_id, token_id=token_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -245,7 +245,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/iam/clients/{client_id}/tokens/{token_id}", + path_template("/iam/clients/{client_id}/tokens/{token_id}", client_id=client_id, token_id=token_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -325,7 +325,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/iam/clients/{client_id}/tokens", + path_template("/iam/clients/{client_id}/tokens", client_id=client_id), body=await async_maybe_transform( { "client_user": client_user, @@ -392,7 +392,7 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/iam/clients/{client_id}/tokens", + path_template("/iam/clients/{client_id}/tokens", client_id=client_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -441,7 +441,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/iam/clients/{client_id}/tokens/{token_id}", + path_template("/iam/clients/{client_id}/tokens/{token_id}", client_id=client_id, token_id=token_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -473,7 +473,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/iam/clients/{client_id}/tokens/{token_id}", + path_template("/iam/clients/{client_id}/tokens/{token_id}", client_id=client_id, token_id=token_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/iam/users.py b/src/gcore/resources/iam/users.py index a991e150..0dc198d7 100644 --- a/src/gcore/resources/iam/users.py +++ b/src/gcore/resources/iam/users.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -90,7 +90,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/iam/users/{user_id}", + path_template("/iam/users/{user_id}", user_id=user_id), body=maybe_transform( { "auth_types": auth_types, @@ -186,7 +186,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/iam/clients/{client_id}/client-users/{user_id}", + path_template("/iam/clients/{client_id}/client-users/{user_id}", client_id=client_id, user_id=user_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -217,7 +217,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/iam/users/{user_id}", + path_template("/iam/users/{user_id}", user_id=user_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -347,7 +347,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/iam/users/{user_id}", + path_template("/iam/users/{user_id}", user_id=user_id), body=await async_maybe_transform( { "auth_types": auth_types, @@ -443,7 +443,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/iam/clients/{client_id}/client-users/{user_id}", + path_template("/iam/clients/{client_id}/client-users/{user_id}", client_id=client_id, user_id=user_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -474,7 +474,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/iam/users/{user_id}", + path_template("/iam/users/{user_id}", user_id=user_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/security/profiles.py b/src/gcore/resources/security/profiles.py index 13cfdcfa..bc60e3c1 100644 --- a/src/gcore/resources/security/profiles.py +++ b/src/gcore/resources/security/profiles.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -172,7 +172,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/security/iaas/v2/profiles/{id}", + path_template("/security/iaas/v2/profiles/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -203,7 +203,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/security/iaas/v2/profiles/{id}", + path_template("/security/iaas/v2/profiles/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -242,7 +242,7 @@ def recreate( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/security/iaas/v2/profiles/{id}/recreate", + path_template("/security/iaas/v2/profiles/{id}/recreate", id=id), body=maybe_transform( { "fields": fields, @@ -292,7 +292,7 @@ def replace( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/security/iaas/v2/profiles/{id}", + path_template("/security/iaas/v2/profiles/{id}", id=id), body=maybe_transform( { "fields": fields, @@ -452,7 +452,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/security/iaas/v2/profiles/{id}", + path_template("/security/iaas/v2/profiles/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -483,7 +483,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/security/iaas/v2/profiles/{id}", + path_template("/security/iaas/v2/profiles/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -522,7 +522,7 @@ async def recreate( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/security/iaas/v2/profiles/{id}/recreate", + path_template("/security/iaas/v2/profiles/{id}/recreate", id=id), body=await async_maybe_transform( { "fields": fields, @@ -572,7 +572,7 @@ async def replace( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/security/iaas/v2/profiles/{id}", + path_template("/security/iaas/v2/profiles/{id}", id=id), body=await async_maybe_transform( { "fields": fields, diff --git a/src/gcore/resources/storage/buckets/buckets.py b/src/gcore/resources/storage/buckets/buckets.py index 7c8c83a0..4bddb9ce 100644 --- a/src/gcore/resources/storage/buckets/buckets.py +++ b/src/gcore/resources/storage/buckets/buckets.py @@ -23,7 +23,7 @@ AsyncPolicyResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform +from ...._utils import path_template, maybe_transform from .lifecycle import ( LifecycleResource, AsyncLifecycleResource, @@ -114,7 +114,11 @@ def create( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -158,7 +162,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/storage/provisioning/v2/storage/{storage_id}/s3/buckets", + path_template("/storage/provisioning/v2/storage/{storage_id}/s3/buckets", storage_id=storage_id), page=SyncOffsetPage[Bucket], options=make_request_options( extra_headers=extra_headers, @@ -210,7 +214,11 @@ def delete( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -284,7 +292,11 @@ async def create( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -328,7 +340,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/storage/provisioning/v2/storage/{storage_id}/s3/buckets", + path_template("/storage/provisioning/v2/storage/{storage_id}/s3/buckets", storage_id=storage_id), page=AsyncOffsetPage[Bucket], options=make_request_options( extra_headers=extra_headers, @@ -380,7 +392,11 @@ async def delete( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/storage/buckets/cors.py b/src/gcore/resources/storage/buckets/cors.py index c6f10f9a..7aa499bb 100644 --- a/src/gcore/resources/storage/buckets/cors.py +++ b/src/gcore/resources/storage/buckets/cors.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -81,7 +81,11 @@ def create( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/cors", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/cors", + storage_id=storage_id, + bucket_name=bucket_name, + ), body=maybe_transform({"allowed_origins": allowed_origins}, cor_create_params.CorCreateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -122,7 +126,11 @@ def get( if not bucket_name: raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") return self._get( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/cors", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/cors", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -188,7 +196,11 @@ async def create( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/cors", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/cors", + storage_id=storage_id, + bucket_name=bucket_name, + ), body=await async_maybe_transform({"allowed_origins": allowed_origins}, cor_create_params.CorCreateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -229,7 +241,11 @@ async def get( if not bucket_name: raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") return await self._get( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/cors", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/cors", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/storage/buckets/lifecycle.py b/src/gcore/resources/storage/buckets/lifecycle.py index 5be5e7dc..1325828f 100644 --- a/src/gcore/resources/storage/buckets/lifecycle.py +++ b/src/gcore/resources/storage/buckets/lifecycle.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -85,7 +85,11 @@ def create( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/lifecycle", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/lifecycle", + storage_id=storage_id, + bucket_name=bucket_name, + ), body=maybe_transform({"expiration_days": expiration_days}, lifecycle_create_params.LifecycleCreateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -127,7 +131,11 @@ def delete( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/lifecycle", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/lifecycle", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -198,7 +206,11 @@ async def create( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/lifecycle", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/lifecycle", + storage_id=storage_id, + bucket_name=bucket_name, + ), body=await async_maybe_transform( {"expiration_days": expiration_days}, lifecycle_create_params.LifecycleCreateParams ), @@ -242,7 +254,11 @@ async def delete( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/lifecycle", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/lifecycle", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/storage/buckets/policy.py b/src/gcore/resources/storage/buckets/policy.py index ac84e0db..fac375bf 100644 --- a/src/gcore/resources/storage/buckets/policy.py +++ b/src/gcore/resources/storage/buckets/policy.py @@ -7,6 +7,7 @@ import httpx from ...._types import Body, Query, Headers, NoneType, NotGiven, not_given +from ...._utils import path_template from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -78,7 +79,11 @@ def create( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -121,7 +126,11 @@ def delete( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -161,7 +170,11 @@ def get( if not bucket_name: raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") return self._get( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -226,7 +239,11 @@ async def create( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -269,7 +286,11 @@ async def delete( raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -309,7 +330,11 @@ async def get( if not bucket_name: raise ValueError(f"Expected a non-empty value for `bucket_name` but received {bucket_name!r}") return await self._get( - f"/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/s3/bucket/{bucket_name}/policy", + storage_id=storage_id, + bucket_name=bucket_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/storage/credentials.py b/src/gcore/resources/storage/credentials.py index e8564751..74e3272d 100644 --- a/src/gcore/resources/storage/credentials.py +++ b/src/gcore/resources/storage/credentials.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -84,7 +84,7 @@ def recreate( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/storage/provisioning/v1/storage/{storage_id}/credentials", + path_template("/storage/provisioning/v1/storage/{storage_id}/credentials", storage_id=storage_id), body=maybe_transform( { "delete_sftp_password": delete_sftp_password, @@ -163,7 +163,7 @@ async def recreate( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/storage/provisioning/v1/storage/{storage_id}/credentials", + path_template("/storage/provisioning/v1/storage/{storage_id}/credentials", storage_id=storage_id), body=await async_maybe_transform( { "delete_sftp_password": delete_sftp_password, diff --git a/src/gcore/resources/storage/storage.py b/src/gcore/resources/storage/storage.py index 0503e68e..00704146 100644 --- a/src/gcore/resources/storage/storage.py +++ b/src/gcore/resources/storage/storage.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from .locations import ( LocationsResource, @@ -197,7 +197,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/storage/provisioning/v2/storage/{storage_id}", + path_template("/storage/provisioning/v2/storage/{storage_id}", storage_id=storage_id), body=maybe_transform( { "expires": expires, @@ -329,7 +329,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/storage/provisioning/v1/storage/{storage_id}", + path_template("/storage/provisioning/v1/storage/{storage_id}", storage_id=storage_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -365,7 +365,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/storage/provisioning/v1/storage/{storage_id}", + path_template("/storage/provisioning/v1/storage/{storage_id}", storage_id=storage_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -404,7 +404,9 @@ def link_ssh_key( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/storage/provisioning/v1/storage/{storage_id}/key/{key_id}/link", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/key/{key_id}/link", storage_id=storage_id, key_id=key_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -441,7 +443,7 @@ def restore( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/storage/provisioning/v1/storage/{storage_id}/restore", + path_template("/storage/provisioning/v1/storage/{storage_id}/restore", storage_id=storage_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -484,7 +486,11 @@ def unlink_ssh_key( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/storage/provisioning/v1/storage/{storage_id}/key/{key_id}/unlink", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/key/{key_id}/unlink", + storage_id=storage_id, + key_id=key_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -632,7 +638,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/storage/provisioning/v2/storage/{storage_id}", + path_template("/storage/provisioning/v2/storage/{storage_id}", storage_id=storage_id), body=await async_maybe_transform( { "expires": expires, @@ -764,7 +770,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/storage/provisioning/v1/storage/{storage_id}", + path_template("/storage/provisioning/v1/storage/{storage_id}", storage_id=storage_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -800,7 +806,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/storage/provisioning/v1/storage/{storage_id}", + path_template("/storage/provisioning/v1/storage/{storage_id}", storage_id=storage_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -839,7 +845,9 @@ async def link_ssh_key( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/storage/provisioning/v1/storage/{storage_id}/key/{key_id}/link", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/key/{key_id}/link", storage_id=storage_id, key_id=key_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -876,7 +884,7 @@ async def restore( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/storage/provisioning/v1/storage/{storage_id}/restore", + path_template("/storage/provisioning/v1/storage/{storage_id}/restore", storage_id=storage_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -921,7 +929,11 @@ async def unlink_ssh_key( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/storage/provisioning/v1/storage/{storage_id}/key/{key_id}/unlink", + path_template( + "/storage/provisioning/v1/storage/{storage_id}/key/{key_id}/unlink", + storage_id=storage_id, + key_id=key_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/ai_tasks.py b/src/gcore/resources/streaming/ai_tasks.py index bb85c829..25907511 100644 --- a/src/gcore/resources/streaming/ai_tasks.py +++ b/src/gcore/resources/streaming/ai_tasks.py @@ -7,7 +7,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -489,7 +489,7 @@ def cancel( if not task_id: raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}") return self._post( - f"/streaming/ai/tasks/{task_id}/cancel", + path_template("/streaming/ai/tasks/{task_id}/cancel", task_id=task_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -561,7 +561,7 @@ def get( if not task_id: raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}") return self._get( - f"/streaming/ai/tasks/{task_id}", + path_template("/streaming/ai/tasks/{task_id}", task_id=task_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1120,7 +1120,7 @@ async def cancel( if not task_id: raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}") return await self._post( - f"/streaming/ai/tasks/{task_id}/cancel", + path_template("/streaming/ai/tasks/{task_id}/cancel", task_id=task_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1192,7 +1192,7 @@ async def get( if not task_id: raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}") return await self._get( - f"/streaming/ai/tasks/{task_id}", + path_template("/streaming/ai/tasks/{task_id}", task_id=task_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/broadcasts.py b/src/gcore/resources/streaming/broadcasts.py index 757bde4d..6b510e52 100644 --- a/src/gcore/resources/streaming/broadcasts.py +++ b/src/gcore/resources/streaming/broadcasts.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -111,7 +111,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/streaming/broadcasts/{broadcast_id}", + path_template("/streaming/broadcasts/{broadcast_id}", broadcast_id=broadcast_id), body=maybe_transform({"broadcast": broadcast}, broadcast_update_params.BroadcastUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -185,7 +185,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/streaming/broadcasts/{broadcast_id}", + path_template("/streaming/broadcasts/{broadcast_id}", broadcast_id=broadcast_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -216,7 +216,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/broadcasts/{broadcast_id}", + path_template("/streaming/broadcasts/{broadcast_id}", broadcast_id=broadcast_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -247,7 +247,7 @@ def get_spectators_count( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/broadcasts/{broadcast_id}/spectators", + path_template("/streaming/broadcasts/{broadcast_id}/spectators", broadcast_id=broadcast_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -343,7 +343,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/streaming/broadcasts/{broadcast_id}", + path_template("/streaming/broadcasts/{broadcast_id}", broadcast_id=broadcast_id), body=await async_maybe_transform({"broadcast": broadcast}, broadcast_update_params.BroadcastUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -417,7 +417,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/streaming/broadcasts/{broadcast_id}", + path_template("/streaming/broadcasts/{broadcast_id}", broadcast_id=broadcast_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -448,7 +448,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/broadcasts/{broadcast_id}", + path_template("/streaming/broadcasts/{broadcast_id}", broadcast_id=broadcast_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -479,7 +479,7 @@ async def get_spectators_count( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/broadcasts/{broadcast_id}/spectators", + path_template("/streaming/broadcasts/{broadcast_id}/spectators", broadcast_id=broadcast_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/directories.py b/src/gcore/resources/streaming/directories.py index 00a379cc..b01a916e 100644 --- a/src/gcore/resources/streaming/directories.py +++ b/src/gcore/resources/streaming/directories.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -117,7 +117,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/streaming/directories/{directory_id}", + path_template("/streaming/directories/{directory_id}", directory_id=directory_id), body=maybe_transform( { "name": name, @@ -166,7 +166,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/streaming/directories/{directory_id}", + path_template("/streaming/directories/{directory_id}", directory_id=directory_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -199,7 +199,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/directories/{directory_id}", + path_template("/streaming/directories/{directory_id}", directory_id=directory_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -324,7 +324,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/streaming/directories/{directory_id}", + path_template("/streaming/directories/{directory_id}", directory_id=directory_id), body=await async_maybe_transform( { "name": name, @@ -373,7 +373,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/streaming/directories/{directory_id}", + path_template("/streaming/directories/{directory_id}", directory_id=directory_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -406,7 +406,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/directories/{directory_id}", + path_template("/streaming/directories/{directory_id}", directory_id=directory_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/players.py b/src/gcore/resources/streaming/players.py index b2590c29..426e177f 100644 --- a/src/gcore/resources/streaming/players.py +++ b/src/gcore/resources/streaming/players.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -109,7 +109,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/streaming/players/{player_id}", + path_template("/streaming/players/{player_id}", player_id=player_id), body=maybe_transform({"player": player}, player_update_params.PlayerUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -181,7 +181,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/streaming/players/{player_id}", + path_template("/streaming/players/{player_id}", player_id=player_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -212,7 +212,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/players/{player_id}", + path_template("/streaming/players/{player_id}", player_id=player_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -244,7 +244,7 @@ def preview( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._get( - f"/streaming/players/{player_id}/preview", + path_template("/streaming/players/{player_id}/preview", player_id=player_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -338,7 +338,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/streaming/players/{player_id}", + path_template("/streaming/players/{player_id}", player_id=player_id), body=await async_maybe_transform({"player": player}, player_update_params.PlayerUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -410,7 +410,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/streaming/players/{player_id}", + path_template("/streaming/players/{player_id}", player_id=player_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -441,7 +441,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/players/{player_id}", + path_template("/streaming/players/{player_id}", player_id=player_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -473,7 +473,7 @@ async def preview( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._get( - f"/streaming/players/{player_id}/preview", + path_template("/streaming/players/{player_id}/preview", player_id=player_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/playlists/playlists.py b/src/gcore/resources/streaming/playlists/playlists.py index 23bcdad7..70494d17 100644 --- a/src/gcore/resources/streaming/playlists/playlists.py +++ b/src/gcore/resources/streaming/playlists/playlists.py @@ -16,7 +16,7 @@ AsyncVideosResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -369,7 +369,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/streaming/playlists/{playlist_id}", + path_template("/streaming/playlists/{playlist_id}", playlist_id=playlist_id), body=maybe_transform( { "active": active, @@ -459,7 +459,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/streaming/playlists/{playlist_id}", + path_template("/streaming/playlists/{playlist_id}", playlist_id=playlist_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -490,7 +490,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/playlists/{playlist_id}", + path_template("/streaming/playlists/{playlist_id}", playlist_id=playlist_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -833,7 +833,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/streaming/playlists/{playlist_id}", + path_template("/streaming/playlists/{playlist_id}", playlist_id=playlist_id), body=await async_maybe_transform( { "active": active, @@ -923,7 +923,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/streaming/playlists/{playlist_id}", + path_template("/streaming/playlists/{playlist_id}", playlist_id=playlist_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -954,7 +954,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/playlists/{playlist_id}", + path_template("/streaming/playlists/{playlist_id}", playlist_id=playlist_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/playlists/videos.py b/src/gcore/resources/streaming/playlists/videos.py index b5478e10..7fc438dd 100644 --- a/src/gcore/resources/streaming/playlists/videos.py +++ b/src/gcore/resources/streaming/playlists/videos.py @@ -5,6 +5,7 @@ import httpx from ...._types import Body, Query, Headers, NotGiven, not_given +from ...._utils import path_template from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -63,7 +64,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/playlists/{playlist_id}/videos", + path_template("/streaming/playlists/{playlist_id}/videos", playlist_id=playlist_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -115,7 +116,7 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/playlists/{playlist_id}/videos", + path_template("/streaming/playlists/{playlist_id}/videos", playlist_id=playlist_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/restreams.py b/src/gcore/resources/streaming/restreams.py index 91f24ab2..d38b2183 100644 --- a/src/gcore/resources/streaming/restreams.py +++ b/src/gcore/resources/streaming/restreams.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -100,7 +100,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/streaming/restreams/{restream_id}", + path_template("/streaming/restreams/{restream_id}", restream_id=restream_id), body=maybe_transform({"restream": restream}, restream_update_params.RestreamUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -172,7 +172,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/streaming/restreams/{restream_id}", + path_template("/streaming/restreams/{restream_id}", restream_id=restream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -203,7 +203,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/restreams/{restream_id}", + path_template("/streaming/restreams/{restream_id}", restream_id=restream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -289,7 +289,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/streaming/restreams/{restream_id}", + path_template("/streaming/restreams/{restream_id}", restream_id=restream_id), body=await async_maybe_transform({"restream": restream}, restream_update_params.RestreamUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -361,7 +361,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/streaming/restreams/{restream_id}", + path_template("/streaming/restreams/{restream_id}", restream_id=restream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -392,7 +392,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/restreams/{restream_id}", + path_template("/streaming/restreams/{restream_id}", restream_id=restream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/streams/clips.py b/src/gcore/resources/streaming/streams/clips.py index 9641f759..0a56882b 100644 --- a/src/gcore/resources/streaming/streams/clips.py +++ b/src/gcore/resources/streaming/streams/clips.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -169,7 +169,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/streaming/streams/{stream_id}/clip_recording", + path_template("/streaming/streams/{stream_id}/clip_recording", stream_id=stream_id), body=maybe_transform( { "duration": duration, @@ -229,7 +229,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/streams/{stream_id}/clip_recording", + path_template("/streaming/streams/{stream_id}/clip_recording", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -384,7 +384,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/streaming/streams/{stream_id}/clip_recording", + path_template("/streaming/streams/{stream_id}/clip_recording", stream_id=stream_id), body=await async_maybe_transform( { "duration": duration, @@ -444,7 +444,7 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/streams/{stream_id}/clip_recording", + path_template("/streaming/streams/{stream_id}/clip_recording", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/streams/overlays.py b/src/gcore/resources/streaming/streams/overlays.py index 780f045b..d7fb5064 100644 --- a/src/gcore/resources/streaming/streams/overlays.py +++ b/src/gcore/resources/streaming/streams/overlays.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -131,7 +131,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/streaming/streams/{stream_id}/overlays", + path_template("/streaming/streams/{stream_id}/overlays", stream_id=stream_id), body=maybe_transform(body, Iterable[overlay_create_params.Body]), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -183,7 +183,9 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/streaming/streams/{stream_id}/overlays/{overlay_id}", + path_template( + "/streaming/streams/{stream_id}/overlays/{overlay_id}", stream_id=stream_id, overlay_id=overlay_id + ), body=maybe_transform( { "height": height, @@ -225,7 +227,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/streams/{stream_id}/overlays", + path_template("/streaming/streams/{stream_id}/overlays", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -258,7 +260,9 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/streaming/streams/{stream_id}/overlays/{overlay_id}", + path_template( + "/streaming/streams/{stream_id}/overlays/{overlay_id}", stream_id=stream_id, overlay_id=overlay_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -290,7 +294,9 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/streams/{stream_id}/overlays/{overlay_id}", + path_template( + "/streaming/streams/{stream_id}/overlays/{overlay_id}", stream_id=stream_id, overlay_id=overlay_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -322,7 +328,7 @@ def update_multiple( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/streaming/streams/{stream_id}/overlays", + path_template("/streaming/streams/{stream_id}/overlays", stream_id=stream_id), body=maybe_transform(body, Iterable[overlay_update_multiple_params.Body]), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -436,7 +442,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/streaming/streams/{stream_id}/overlays", + path_template("/streaming/streams/{stream_id}/overlays", stream_id=stream_id), body=await async_maybe_transform(body, Iterable[overlay_create_params.Body]), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -488,7 +494,9 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/streaming/streams/{stream_id}/overlays/{overlay_id}", + path_template( + "/streaming/streams/{stream_id}/overlays/{overlay_id}", stream_id=stream_id, overlay_id=overlay_id + ), body=await async_maybe_transform( { "height": height, @@ -530,7 +538,7 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/streams/{stream_id}/overlays", + path_template("/streaming/streams/{stream_id}/overlays", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -563,7 +571,9 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/streaming/streams/{stream_id}/overlays/{overlay_id}", + path_template( + "/streaming/streams/{stream_id}/overlays/{overlay_id}", stream_id=stream_id, overlay_id=overlay_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -595,7 +605,9 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/streams/{stream_id}/overlays/{overlay_id}", + path_template( + "/streaming/streams/{stream_id}/overlays/{overlay_id}", stream_id=stream_id, overlay_id=overlay_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -627,7 +639,7 @@ async def update_multiple( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/streaming/streams/{stream_id}/overlays", + path_template("/streaming/streams/{stream_id}/overlays", stream_id=stream_id), body=await async_maybe_transform(body, Iterable[overlay_update_multiple_params.Body]), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gcore/resources/streaming/streams/streams.py b/src/gcore/resources/streaming/streams/streams.py index e6d64810..3552af50 100644 --- a/src/gcore/resources/streaming/streams/streams.py +++ b/src/gcore/resources/streaming/streams/streams.py @@ -24,7 +24,7 @@ AsyncOverlaysResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -311,7 +311,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/streaming/streams/{stream_id}", + path_template("/streaming/streams/{stream_id}", stream_id=stream_id), body=maybe_transform({"stream": stream}, stream_update_params.StreamUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -412,7 +412,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/streaming/streams/{stream_id}", + path_template("/streaming/streams/{stream_id}", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -444,7 +444,7 @@ def clear_dvr( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._put( - f"/streaming/streams/{stream_id}/dvr_cleanup", + path_template("/streaming/streams/{stream_id}/dvr_cleanup", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -475,7 +475,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/streams/{stream_id}", + path_template("/streaming/streams/{stream_id}", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -546,7 +546,7 @@ def start_recording( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/streaming/streams/{stream_id}/start_recording", + path_template("/streaming/streams/{stream_id}/start_recording", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -583,7 +583,7 @@ def stop_recording( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/streaming/streams/{stream_id}/stop_recording", + path_template("/streaming/streams/{stream_id}/stop_recording", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -859,7 +859,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/streaming/streams/{stream_id}", + path_template("/streaming/streams/{stream_id}", stream_id=stream_id), body=await async_maybe_transform({"stream": stream}, stream_update_params.StreamUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -960,7 +960,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/streaming/streams/{stream_id}", + path_template("/streaming/streams/{stream_id}", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -992,7 +992,7 @@ async def clear_dvr( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._put( - f"/streaming/streams/{stream_id}/dvr_cleanup", + path_template("/streaming/streams/{stream_id}/dvr_cleanup", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1023,7 +1023,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/streams/{stream_id}", + path_template("/streaming/streams/{stream_id}", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1094,7 +1094,7 @@ async def start_recording( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/streaming/streams/{stream_id}/start_recording", + path_template("/streaming/streams/{stream_id}/start_recording", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1131,7 +1131,7 @@ async def stop_recording( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/streaming/streams/{stream_id}/stop_recording", + path_template("/streaming/streams/{stream_id}/stop_recording", stream_id=stream_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/videos/subtitles.py b/src/gcore/resources/streaming/videos/subtitles.py index c483d4b5..cdad8b27 100644 --- a/src/gcore/resources/streaming/videos/subtitles.py +++ b/src/gcore/resources/streaming/videos/subtitles.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -134,7 +134,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/streaming/videos/{video_id}/subtitles", + path_template("/streaming/videos/{video_id}/subtitles", video_id=video_id), body=maybe_transform(body, subtitle_create_params.SubtitleCreateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -188,7 +188,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/streaming/videos/{video_id}/subtitles/{id}", + path_template("/streaming/videos/{video_id}/subtitles/{id}", video_id=video_id, id=id), body=maybe_transform( { "language": language, @@ -227,7 +227,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/videos/{video_id}/subtitles", + path_template("/streaming/videos/{video_id}/subtitles", video_id=video_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -260,7 +260,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/streaming/videos/{video_id}/subtitles/{id}", + path_template("/streaming/videos/{video_id}/subtitles/{id}", video_id=video_id, id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -292,7 +292,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/videos/{video_id}/subtitles/{id}", + path_template("/streaming/videos/{video_id}/subtitles/{id}", video_id=video_id, id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -411,7 +411,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/streaming/videos/{video_id}/subtitles", + path_template("/streaming/videos/{video_id}/subtitles", video_id=video_id), body=await async_maybe_transform(body, subtitle_create_params.SubtitleCreateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -465,7 +465,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/streaming/videos/{video_id}/subtitles/{id}", + path_template("/streaming/videos/{video_id}/subtitles/{id}", video_id=video_id, id=id), body=await async_maybe_transform( { "language": language, @@ -504,7 +504,7 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/videos/{video_id}/subtitles", + path_template("/streaming/videos/{video_id}/subtitles", video_id=video_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -537,7 +537,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/streaming/videos/{video_id}/subtitles/{id}", + path_template("/streaming/videos/{video_id}/subtitles/{id}", video_id=video_id, id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -569,7 +569,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/videos/{video_id}/subtitles/{id}", + path_template("/streaming/videos/{video_id}/subtitles/{id}", video_id=video_id, id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/streaming/videos/videos.py b/src/gcore/resources/streaming/videos/videos.py index 60c435c3..79efd43a 100644 --- a/src/gcore/resources/streaming/videos/videos.py +++ b/src/gcore/resources/streaming/videos/videos.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from .subtitles import ( SubtitlesResource, AsyncSubtitlesResource, @@ -418,7 +418,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/streaming/videos/{video_id}", + path_template("/streaming/videos/{video_id}", video_id=video_id), body=maybe_transform( { "name": name, @@ -575,7 +575,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/streaming/videos/{video_id}", + path_template("/streaming/videos/{video_id}", video_id=video_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -680,7 +680,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/videos/{video_id}", + path_template("/streaming/videos/{video_id}", video_id=video_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -744,7 +744,7 @@ def get_parameters_for_direct_upload( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/streaming/videos/{video_id}/upload", + path_template("/streaming/videos/{video_id}/upload", video_id=video_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1165,7 +1165,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/streaming/videos/{video_id}", + path_template("/streaming/videos/{video_id}", video_id=video_id), body=await async_maybe_transform( { "name": name, @@ -1322,7 +1322,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/streaming/videos/{video_id}", + path_template("/streaming/videos/{video_id}", video_id=video_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1431,7 +1431,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/videos/{video_id}", + path_template("/streaming/videos/{video_id}", video_id=video_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1495,7 +1495,7 @@ async def get_parameters_for_direct_upload( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/streaming/videos/{video_id}/upload", + path_template("/streaming/videos/{video_id}/upload", video_id=video_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/analytics.py b/src/gcore/resources/waap/analytics.py index 65f50a90..ad390079 100644 --- a/src/gcore/resources/waap/analytics.py +++ b/src/gcore/resources/waap/analytics.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -102,7 +102,7 @@ def get_event_statistics( if not dimension: raise ValueError(f"Expected a non-empty value for `dimension` but received {dimension!r}") return self._get( - f"/waap/v1/analytics/stats/{dimension}", + path_template("/waap/v1/analytics/stats/{dimension}", dimension=dimension), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -467,7 +467,7 @@ async def get_event_statistics( if not dimension: raise ValueError(f"Expected a non-empty value for `dimension` but received {dimension!r}") return await self._get( - f"/waap/v1/analytics/stats/{dimension}", + path_template("/waap/v1/analytics/stats/{dimension}", dimension=dimension), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gcore/resources/waap/custom_page_sets.py b/src/gcore/resources/waap/custom_page_sets.py index 11d40a03..ad167234 100644 --- a/src/gcore/resources/waap/custom_page_sets.py +++ b/src/gcore/resources/waap/custom_page_sets.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -152,7 +152,7 @@ def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._patch( - f"/waap/v1/custom-page-sets/{set_id}", + path_template("/waap/v1/custom-page-sets/{set_id}", set_id=set_id), body=maybe_transform( { "block": block, @@ -258,7 +258,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/waap/v1/custom-page-sets/{set_id}", + path_template("/waap/v1/custom-page-sets/{set_id}", set_id=set_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -291,7 +291,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/waap/v1/custom-page-sets/{set_id}", + path_template("/waap/v1/custom-page-sets/{set_id}", set_id=set_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -494,7 +494,7 @@ async def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._patch( - f"/waap/v1/custom-page-sets/{set_id}", + path_template("/waap/v1/custom-page-sets/{set_id}", set_id=set_id), body=await async_maybe_transform( { "block": block, @@ -600,7 +600,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/waap/v1/custom-page-sets/{set_id}", + path_template("/waap/v1/custom-page-sets/{set_id}", set_id=set_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -633,7 +633,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/waap/v1/custom-page-sets/{set_id}", + path_template("/waap/v1/custom-page-sets/{set_id}", set_id=set_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/advanced_rules.py b/src/gcore/resources/waap/domains/advanced_rules.py index 87e9e974..09678500 100644 --- a/src/gcore/resources/waap/domains/advanced_rules.py +++ b/src/gcore/resources/waap/domains/advanced_rules.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -104,7 +104,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/waap/v1/domains/{domain_id}/advanced-rules", + path_template("/waap/v1/domains/{domain_id}/advanced-rules", domain_id=domain_id), body=maybe_transform( { "action": action, @@ -184,7 +184,9 @@ def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._patch( - f"/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), body=maybe_transform( { "action": action, @@ -278,7 +280,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/advanced-rules", + path_template("/waap/v1/domains/{domain_id}/advanced-rules", domain_id=domain_id), page=SyncOffsetPage[WaapAdvancedRule], options=make_request_options( extra_headers=extra_headers, @@ -332,7 +334,9 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -368,7 +372,9 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -410,7 +416,12 @@ def toggle( raise ValueError(f"Expected a non-empty value for `action` but received {action!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._patch( - f"/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}/{action}", + path_template( + "/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}/{action}", + domain_id=domain_id, + rule_id=rule_id, + action=action, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -497,7 +508,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/waap/v1/domains/{domain_id}/advanced-rules", + path_template("/waap/v1/domains/{domain_id}/advanced-rules", domain_id=domain_id), body=await async_maybe_transform( { "action": action, @@ -577,7 +588,9 @@ async def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._patch( - f"/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), body=await async_maybe_transform( { "action": action, @@ -671,7 +684,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/advanced-rules", + path_template("/waap/v1/domains/{domain_id}/advanced-rules", domain_id=domain_id), page=AsyncOffsetPage[WaapAdvancedRule], options=make_request_options( extra_headers=extra_headers, @@ -725,7 +738,9 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -761,7 +776,9 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -803,7 +820,12 @@ async def toggle( raise ValueError(f"Expected a non-empty value for `action` but received {action!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._patch( - f"/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}/{action}", + path_template( + "/waap/v1/domains/{domain_id}/advanced-rules/{rule_id}/{action}", + domain_id=domain_id, + rule_id=rule_id, + action=action, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/api_discovery/openapi.py b/src/gcore/resources/waap/domains/api_discovery/openapi.py index 1bc07a1b..bf18ca2c 100644 --- a/src/gcore/resources/waap/domains/api_discovery/openapi.py +++ b/src/gcore/resources/waap/domains/api_discovery/openapi.py @@ -5,7 +5,7 @@ import httpx from ....._types import Body, Query, Headers, NotGiven, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -70,7 +70,7 @@ def scan( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/waap/v1/domains/{domain_id}/api-discovery/scan", + path_template("/waap/v1/domains/{domain_id}/api-discovery/scan", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -113,7 +113,7 @@ def upload( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/waap/v1/domains/{domain_id}/api-discovery/upload", + path_template("/waap/v1/domains/{domain_id}/api-discovery/upload", domain_id=domain_id), body=maybe_transform( { "file_data": file_data, @@ -177,7 +177,7 @@ async def scan( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/waap/v1/domains/{domain_id}/api-discovery/scan", + path_template("/waap/v1/domains/{domain_id}/api-discovery/scan", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -220,7 +220,7 @@ async def upload( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/waap/v1/domains/{domain_id}/api-discovery/upload", + path_template("/waap/v1/domains/{domain_id}/api-discovery/upload", domain_id=domain_id), body=await async_maybe_transform( { "file_data": file_data, diff --git a/src/gcore/resources/waap/domains/api_discovery/scan_results.py b/src/gcore/resources/waap/domains/api_discovery/scan_results.py index 31193f33..b039d634 100644 --- a/src/gcore/resources/waap/domains/api_discovery/scan_results.py +++ b/src/gcore/resources/waap/domains/api_discovery/scan_results.py @@ -8,7 +8,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform +from ....._utils import path_template, maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -103,7 +103,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/api-discovery/scan-results", + path_template("/waap/v1/domains/{domain_id}/api-discovery/scan-results", domain_id=domain_id), page=SyncOffsetPage[WaapAPIScanResult], options=make_request_options( extra_headers=extra_headers, @@ -156,7 +156,11 @@ def get( if not scan_id: raise ValueError(f"Expected a non-empty value for `scan_id` but received {scan_id!r}") return self._get( - f"/waap/v1/domains/{domain_id}/api-discovery/scan-results/{scan_id}", + path_template( + "/waap/v1/domains/{domain_id}/api-discovery/scan-results/{scan_id}", + domain_id=domain_id, + scan_id=scan_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -242,7 +246,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/api-discovery/scan-results", + path_template("/waap/v1/domains/{domain_id}/api-discovery/scan-results", domain_id=domain_id), page=AsyncOffsetPage[WaapAPIScanResult], options=make_request_options( extra_headers=extra_headers, @@ -295,7 +299,11 @@ async def get( if not scan_id: raise ValueError(f"Expected a non-empty value for `scan_id` but received {scan_id!r}") return await self._get( - f"/waap/v1/domains/{domain_id}/api-discovery/scan-results/{scan_id}", + path_template( + "/waap/v1/domains/{domain_id}/api-discovery/scan-results/{scan_id}", + domain_id=domain_id, + scan_id=scan_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/api_discovery/settings.py b/src/gcore/resources/waap/domains/api_discovery/settings.py index 1b4b35eb..78f22a41 100644 --- a/src/gcore/resources/waap/domains/api_discovery/settings.py +++ b/src/gcore/resources/waap/domains/api_discovery/settings.py @@ -7,7 +7,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -86,7 +86,7 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._patch( - f"/waap/v1/domains/{domain_id}/api-discovery/settings", + path_template("/waap/v1/domains/{domain_id}/api-discovery/settings", domain_id=domain_id), body=maybe_transform( { "description_file_location": description_file_location, @@ -129,7 +129,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/waap/v1/domains/{domain_id}/api-discovery/settings", + path_template("/waap/v1/domains/{domain_id}/api-discovery/settings", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -200,7 +200,7 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._patch( - f"/waap/v1/domains/{domain_id}/api-discovery/settings", + path_template("/waap/v1/domains/{domain_id}/api-discovery/settings", domain_id=domain_id), body=await async_maybe_transform( { "description_file_location": description_file_location, @@ -243,7 +243,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/waap/v1/domains/{domain_id}/api-discovery/settings", + path_template("/waap/v1/domains/{domain_id}/api-discovery/settings", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/api_path_groups.py b/src/gcore/resources/waap/domains/api_path_groups.py index a6b25b2e..cf7db668 100644 --- a/src/gcore/resources/waap/domains/api_path_groups.py +++ b/src/gcore/resources/waap/domains/api_path_groups.py @@ -5,6 +5,7 @@ import httpx from ...._types import Body, Query, Headers, NotGiven, not_given +from ...._utils import path_template from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -65,7 +66,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/waap/v1/domains/{domain_id}/api-path-groups", + path_template("/waap/v1/domains/{domain_id}/api-path-groups", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -119,7 +120,7 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/waap/v1/domains/{domain_id}/api-path-groups", + path_template("/waap/v1/domains/{domain_id}/api-path-groups", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/api_paths.py b/src/gcore/resources/waap/domains/api_paths.py index cdc33365..769a49ff 100644 --- a/src/gcore/resources/waap/domains/api_paths.py +++ b/src/gcore/resources/waap/domains/api_paths.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -84,7 +84,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/waap/v1/domains/{domain_id}/api-paths", + path_template("/waap/v1/domains/{domain_id}/api-paths", domain_id=domain_id), body=maybe_transform( { "http_scheme": http_scheme, @@ -143,7 +143,7 @@ def update( raise ValueError(f"Expected a non-empty value for `path_id` but received {path_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._patch( - f"/waap/v1/domains/{domain_id}/api-paths/{path_id}", + path_template("/waap/v1/domains/{domain_id}/api-paths/{path_id}", domain_id=domain_id, path_id=path_id), body=maybe_transform( { "api_groups": api_groups, @@ -238,7 +238,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/api-paths", + path_template("/waap/v1/domains/{domain_id}/api-paths", domain_id=domain_id), page=SyncOffsetPage[WaapAPIPath], options=make_request_options( extra_headers=extra_headers, @@ -297,7 +297,7 @@ def delete( raise ValueError(f"Expected a non-empty value for `path_id` but received {path_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/waap/v1/domains/{domain_id}/api-paths/{path_id}", + path_template("/waap/v1/domains/{domain_id}/api-paths/{path_id}", domain_id=domain_id, path_id=path_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -335,7 +335,7 @@ def get( if not path_id: raise ValueError(f"Expected a non-empty value for `path_id` but received {path_id!r}") return self._get( - f"/waap/v1/domains/{domain_id}/api-paths/{path_id}", + path_template("/waap/v1/domains/{domain_id}/api-paths/{path_id}", domain_id=domain_id, path_id=path_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -402,7 +402,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/waap/v1/domains/{domain_id}/api-paths", + path_template("/waap/v1/domains/{domain_id}/api-paths", domain_id=domain_id), body=await async_maybe_transform( { "http_scheme": http_scheme, @@ -461,7 +461,7 @@ async def update( raise ValueError(f"Expected a non-empty value for `path_id` but received {path_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._patch( - f"/waap/v1/domains/{domain_id}/api-paths/{path_id}", + path_template("/waap/v1/domains/{domain_id}/api-paths/{path_id}", domain_id=domain_id, path_id=path_id), body=await async_maybe_transform( { "api_groups": api_groups, @@ -556,7 +556,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/api-paths", + path_template("/waap/v1/domains/{domain_id}/api-paths", domain_id=domain_id), page=AsyncOffsetPage[WaapAPIPath], options=make_request_options( extra_headers=extra_headers, @@ -615,7 +615,7 @@ async def delete( raise ValueError(f"Expected a non-empty value for `path_id` but received {path_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/waap/v1/domains/{domain_id}/api-paths/{path_id}", + path_template("/waap/v1/domains/{domain_id}/api-paths/{path_id}", domain_id=domain_id, path_id=path_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -653,7 +653,7 @@ async def get( if not path_id: raise ValueError(f"Expected a non-empty value for `path_id` but received {path_id!r}") return await self._get( - f"/waap/v1/domains/{domain_id}/api-paths/{path_id}", + path_template("/waap/v1/domains/{domain_id}/api-paths/{path_id}", domain_id=domain_id, path_id=path_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/custom_rules.py b/src/gcore/resources/waap/domains/custom_rules.py index e81e575e..10488705 100644 --- a/src/gcore/resources/waap/domains/custom_rules.py +++ b/src/gcore/resources/waap/domains/custom_rules.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -93,7 +93,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/waap/v1/domains/{domain_id}/custom-rules", + path_template("/waap/v1/domains/{domain_id}/custom-rules", domain_id=domain_id), body=maybe_transform( { "action": action, @@ -156,7 +156,7 @@ def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._patch( - f"/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", + path_template("/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id), body=maybe_transform( { "action": action, @@ -226,7 +226,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/custom-rules", + path_template("/waap/v1/domains/{domain_id}/custom-rules", domain_id=domain_id), page=SyncOffsetPage[WaapCustomRule], options=make_request_options( extra_headers=extra_headers, @@ -279,7 +279,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", + path_template("/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -316,7 +316,7 @@ def delete_multiple( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/waap/v1/domains/{domain_id}/custom-rules/bulk_delete", + path_template("/waap/v1/domains/{domain_id}/custom-rules/bulk_delete", domain_id=domain_id), body=maybe_transform( {"rule_ids": rule_ids}, custom_rule_delete_multiple_params.CustomRuleDeleteMultipleParams ), @@ -355,7 +355,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", + path_template("/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -397,7 +397,12 @@ def toggle( raise ValueError(f"Expected a non-empty value for `action` but received {action!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._patch( - f"/waap/v1/domains/{domain_id}/custom-rules/{rule_id}/{action}", + path_template( + "/waap/v1/domains/{domain_id}/custom-rules/{rule_id}/{action}", + domain_id=domain_id, + rule_id=rule_id, + action=action, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -468,7 +473,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/waap/v1/domains/{domain_id}/custom-rules", + path_template("/waap/v1/domains/{domain_id}/custom-rules", domain_id=domain_id), body=await async_maybe_transform( { "action": action, @@ -531,7 +536,7 @@ async def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._patch( - f"/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", + path_template("/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id), body=await async_maybe_transform( { "action": action, @@ -601,7 +606,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/custom-rules", + path_template("/waap/v1/domains/{domain_id}/custom-rules", domain_id=domain_id), page=AsyncOffsetPage[WaapCustomRule], options=make_request_options( extra_headers=extra_headers, @@ -654,7 +659,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", + path_template("/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -691,7 +696,7 @@ async def delete_multiple( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/waap/v1/domains/{domain_id}/custom-rules/bulk_delete", + path_template("/waap/v1/domains/{domain_id}/custom-rules/bulk_delete", domain_id=domain_id), body=await async_maybe_transform( {"rule_ids": rule_ids}, custom_rule_delete_multiple_params.CustomRuleDeleteMultipleParams ), @@ -730,7 +735,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", + path_template("/waap/v1/domains/{domain_id}/custom-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -772,7 +777,12 @@ async def toggle( raise ValueError(f"Expected a non-empty value for `action` but received {action!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._patch( - f"/waap/v1/domains/{domain_id}/custom-rules/{rule_id}/{action}", + path_template( + "/waap/v1/domains/{domain_id}/custom-rules/{rule_id}/{action}", + domain_id=domain_id, + rule_id=rule_id, + action=action, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/domains.py b/src/gcore/resources/waap/domains/domains.py index e214ec63..d1f75b20 100644 --- a/src/gcore/resources/waap/domains/domains.py +++ b/src/gcore/resources/waap/domains/domains.py @@ -32,7 +32,7 @@ AsyncSettingsResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from .api_paths import ( APIPathsResource, AsyncAPIPathsResource, @@ -213,7 +213,7 @@ def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._patch( - f"/waap/v1/domains/{domain_id}", + path_template("/waap/v1/domains/{domain_id}", domain_id=domain_id), body=maybe_transform({"status": status}, domain_update_params.DomainUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -313,7 +313,7 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/waap/v1/domains/{domain_id}", + path_template("/waap/v1/domains/{domain_id}", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -346,7 +346,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/waap/v1/domains/{domain_id}", + path_template("/waap/v1/domains/{domain_id}", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -379,7 +379,7 @@ def list_rule_sets( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/waap/v1/domains/{domain_id}/rule-sets", + path_template("/waap/v1/domains/{domain_id}/rule-sets", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -485,7 +485,7 @@ async def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._patch( - f"/waap/v1/domains/{domain_id}", + path_template("/waap/v1/domains/{domain_id}", domain_id=domain_id), body=await async_maybe_transform({"status": status}, domain_update_params.DomainUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -585,7 +585,7 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/waap/v1/domains/{domain_id}", + path_template("/waap/v1/domains/{domain_id}", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -618,7 +618,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/waap/v1/domains/{domain_id}", + path_template("/waap/v1/domains/{domain_id}", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -651,7 +651,7 @@ async def list_rule_sets( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/waap/v1/domains/{domain_id}/rule-sets", + path_template("/waap/v1/domains/{domain_id}/rule-sets", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/firewall_rules.py b/src/gcore/resources/waap/domains/firewall_rules.py index 3dbdde0b..abe2cfc7 100644 --- a/src/gcore/resources/waap/domains/firewall_rules.py +++ b/src/gcore/resources/waap/domains/firewall_rules.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -91,7 +91,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/waap/v1/domains/{domain_id}/firewall-rules", + path_template("/waap/v1/domains/{domain_id}/firewall-rules", domain_id=domain_id), body=maybe_transform( { "action": action, @@ -153,7 +153,9 @@ def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._patch( - f"/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), body=maybe_transform( { "action": action, @@ -223,7 +225,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/firewall-rules", + path_template("/waap/v1/domains/{domain_id}/firewall-rules", domain_id=domain_id), page=SyncOffsetPage[WaapFirewallRule], options=make_request_options( extra_headers=extra_headers, @@ -276,7 +278,9 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -313,7 +317,7 @@ def delete_multiple( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/waap/v1/domains/{domain_id}/firewall-rules/bulk_delete", + path_template("/waap/v1/domains/{domain_id}/firewall-rules/bulk_delete", domain_id=domain_id), body=maybe_transform( {"rule_ids": rule_ids}, firewall_rule_delete_multiple_params.FirewallRuleDeleteMultipleParams ), @@ -352,7 +356,9 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -394,7 +400,12 @@ def toggle( raise ValueError(f"Expected a non-empty value for `action` but received {action!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._patch( - f"/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}/{action}", + path_template( + "/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}/{action}", + domain_id=domain_id, + rule_id=rule_id, + action=action, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -463,7 +474,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/waap/v1/domains/{domain_id}/firewall-rules", + path_template("/waap/v1/domains/{domain_id}/firewall-rules", domain_id=domain_id), body=await async_maybe_transform( { "action": action, @@ -525,7 +536,9 @@ async def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._patch( - f"/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), body=await async_maybe_transform( { "action": action, @@ -595,7 +608,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/firewall-rules", + path_template("/waap/v1/domains/{domain_id}/firewall-rules", domain_id=domain_id), page=AsyncOffsetPage[WaapFirewallRule], options=make_request_options( extra_headers=extra_headers, @@ -648,7 +661,9 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -685,7 +700,7 @@ async def delete_multiple( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/waap/v1/domains/{domain_id}/firewall-rules/bulk_delete", + path_template("/waap/v1/domains/{domain_id}/firewall-rules/bulk_delete", domain_id=domain_id), body=await async_maybe_transform( {"rule_ids": rule_ids}, firewall_rule_delete_multiple_params.FirewallRuleDeleteMultipleParams ), @@ -724,7 +739,9 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", + path_template( + "/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}", domain_id=domain_id, rule_id=rule_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -766,7 +783,12 @@ async def toggle( raise ValueError(f"Expected a non-empty value for `action` but received {action!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._patch( - f"/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}/{action}", + path_template( + "/waap/v1/domains/{domain_id}/firewall-rules/{rule_id}/{action}", + domain_id=domain_id, + rule_id=rule_id, + action=action, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/insight_silences.py b/src/gcore/resources/waap/domains/insight_silences.py index 8b57783e..7a2f944b 100644 --- a/src/gcore/resources/waap/domains/insight_silences.py +++ b/src/gcore/resources/waap/domains/insight_silences.py @@ -9,7 +9,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -93,7 +93,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ return self._post( - f"/waap/v1/domains/{domain_id}/insight-silences", + path_template("/waap/v1/domains/{domain_id}/insight-silences", domain_id=domain_id), body=maybe_transform( { "author": author, @@ -153,7 +153,9 @@ def update( if not silence_id: raise ValueError(f"Expected a non-empty value for `silence_id` but received {silence_id!r}") return self._patch( - f"/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", + path_template( + "/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", domain_id=domain_id, silence_id=silence_id + ), body=maybe_transform( { "author": author, @@ -228,7 +230,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/insight-silences", + path_template("/waap/v1/domains/{domain_id}/insight-silences", domain_id=domain_id), page=SyncOffsetPage[WaapInsightSilence], options=make_request_options( extra_headers=extra_headers, @@ -283,7 +285,9 @@ def delete( raise ValueError(f"Expected a non-empty value for `silence_id` but received {silence_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", + path_template( + "/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", domain_id=domain_id, silence_id=silence_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -321,7 +325,9 @@ def get( if not silence_id: raise ValueError(f"Expected a non-empty value for `silence_id` but received {silence_id!r}") return self._get( - f"/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", + path_template( + "/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", domain_id=domain_id, silence_id=silence_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -392,7 +398,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ return await self._post( - f"/waap/v1/domains/{domain_id}/insight-silences", + path_template("/waap/v1/domains/{domain_id}/insight-silences", domain_id=domain_id), body=await async_maybe_transform( { "author": author, @@ -452,7 +458,9 @@ async def update( if not silence_id: raise ValueError(f"Expected a non-empty value for `silence_id` but received {silence_id!r}") return await self._patch( - f"/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", + path_template( + "/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", domain_id=domain_id, silence_id=silence_id + ), body=await async_maybe_transform( { "author": author, @@ -527,7 +535,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/insight-silences", + path_template("/waap/v1/domains/{domain_id}/insight-silences", domain_id=domain_id), page=AsyncOffsetPage[WaapInsightSilence], options=make_request_options( extra_headers=extra_headers, @@ -582,7 +590,9 @@ async def delete( raise ValueError(f"Expected a non-empty value for `silence_id` but received {silence_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", + path_template( + "/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", domain_id=domain_id, silence_id=silence_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -620,7 +630,9 @@ async def get( if not silence_id: raise ValueError(f"Expected a non-empty value for `silence_id` but received {silence_id!r}") return await self._get( - f"/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", + path_template( + "/waap/v1/domains/{domain_id}/insight-silences/{silence_id}", domain_id=domain_id, silence_id=silence_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/insights.py b/src/gcore/resources/waap/domains/insights.py index 924fe5e2..e9098d3a 100644 --- a/src/gcore/resources/waap/domains/insights.py +++ b/src/gcore/resources/waap/domains/insights.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -106,7 +106,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/insights", + path_template("/waap/v1/domains/{domain_id}/insights", domain_id=domain_id), page=SyncOffsetPage[WaapInsight], options=make_request_options( extra_headers=extra_headers, @@ -158,7 +158,9 @@ def get( if not insight_id: raise ValueError(f"Expected a non-empty value for `insight_id` but received {insight_id!r}") return self._get( - f"/waap/v1/domains/{domain_id}/insights/{insight_id}", + path_template( + "/waap/v1/domains/{domain_id}/insights/{insight_id}", domain_id=domain_id, insight_id=insight_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -199,7 +201,9 @@ def replace( if not insight_id: raise ValueError(f"Expected a non-empty value for `insight_id` but received {insight_id!r}") return self._put( - f"/waap/v1/domains/{domain_id}/insights/{insight_id}", + path_template( + "/waap/v1/domains/{domain_id}/insights/{insight_id}", domain_id=domain_id, insight_id=insight_id + ), body=maybe_transform({"status": status}, insight_replace_params.InsightReplaceParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -289,7 +293,7 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/insights", + path_template("/waap/v1/domains/{domain_id}/insights", domain_id=domain_id), page=AsyncOffsetPage[WaapInsight], options=make_request_options( extra_headers=extra_headers, @@ -341,7 +345,9 @@ async def get( if not insight_id: raise ValueError(f"Expected a non-empty value for `insight_id` but received {insight_id!r}") return await self._get( - f"/waap/v1/domains/{domain_id}/insights/{insight_id}", + path_template( + "/waap/v1/domains/{domain_id}/insights/{insight_id}", domain_id=domain_id, insight_id=insight_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -382,7 +388,9 @@ async def replace( if not insight_id: raise ValueError(f"Expected a non-empty value for `insight_id` but received {insight_id!r}") return await self._put( - f"/waap/v1/domains/{domain_id}/insights/{insight_id}", + path_template( + "/waap/v1/domains/{domain_id}/insights/{insight_id}", domain_id=domain_id, insight_id=insight_id + ), body=await async_maybe_transform({"status": status}, insight_replace_params.InsightReplaceParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gcore/resources/waap/domains/policies.py b/src/gcore/resources/waap/domains/policies.py index c4af1f74..3099badb 100644 --- a/src/gcore/resources/waap/domains/policies.py +++ b/src/gcore/resources/waap/domains/policies.py @@ -5,6 +5,7 @@ import httpx from ...._types import Body, Query, Headers, NotGiven, not_given +from ...._utils import path_template from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -70,7 +71,9 @@ def toggle( if not policy_id: raise ValueError(f"Expected a non-empty value for `policy_id` but received {policy_id!r}") return self._patch( - f"/waap/v1/domains/{domain_id}/policies/{policy_id}/toggle", + path_template( + "/waap/v1/domains/{domain_id}/policies/{policy_id}/toggle", domain_id=domain_id, policy_id=policy_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -129,7 +132,9 @@ async def toggle( if not policy_id: raise ValueError(f"Expected a non-empty value for `policy_id` but received {policy_id!r}") return await self._patch( - f"/waap/v1/domains/{domain_id}/policies/{policy_id}/toggle", + path_template( + "/waap/v1/domains/{domain_id}/policies/{policy_id}/toggle", domain_id=domain_id, policy_id=policy_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/settings.py b/src/gcore/resources/waap/domains/settings.py index fcaabeaa..45acac44 100644 --- a/src/gcore/resources/waap/domains/settings.py +++ b/src/gcore/resources/waap/domains/settings.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -74,7 +74,7 @@ def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._patch( - f"/waap/v1/domains/{domain_id}/settings", + path_template("/waap/v1/domains/{domain_id}/settings", domain_id=domain_id), body=maybe_transform( { "api": api, @@ -114,7 +114,7 @@ def get( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/waap/v1/domains/{domain_id}/settings", + path_template("/waap/v1/domains/{domain_id}/settings", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -175,7 +175,7 @@ async def update( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._patch( - f"/waap/v1/domains/{domain_id}/settings", + path_template("/waap/v1/domains/{domain_id}/settings", domain_id=domain_id), body=await async_maybe_transform( { "api": api, @@ -215,7 +215,7 @@ async def get( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/waap/v1/domains/{domain_id}/settings", + path_template("/waap/v1/domains/{domain_id}/settings", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gcore/resources/waap/domains/statistics.py b/src/gcore/resources/waap/domains/statistics.py index 906d2a57..eb624af5 100644 --- a/src/gcore/resources/waap/domains/statistics.py +++ b/src/gcore/resources/waap/domains/statistics.py @@ -9,7 +9,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -94,7 +94,7 @@ def get_ddos_attacks( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/ddos-attacks", + path_template("/waap/v1/domains/{domain_id}/ddos-attacks", domain_id=domain_id), page=SyncOffsetPage[WaapDDOSAttack], options=make_request_options( extra_headers=extra_headers, @@ -157,7 +157,7 @@ def get_ddos_info( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/ddos-info", + path_template("/waap/v1/domains/{domain_id}/ddos-info", domain_id=domain_id), page=SyncOffsetPage[WaapDDOSInfo], options=make_request_options( extra_headers=extra_headers, @@ -223,7 +223,7 @@ def get_events_aggregated( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/waap/v1/domains/{domain_id}/stats", + path_template("/waap/v1/domains/{domain_id}/stats", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -276,7 +276,9 @@ def get_request_details( if not request_id: raise ValueError(f"Expected a non-empty value for `request_id` but received {request_id!r}") return self._get( - f"/waap/v1/domains/{domain_id}/requests/{request_id}/details", + path_template( + "/waap/v1/domains/{domain_id}/requests/{request_id}/details", domain_id=domain_id, request_id=request_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -345,7 +347,7 @@ def get_ddos_attacks( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/ddos-attacks", + path_template("/waap/v1/domains/{domain_id}/ddos-attacks", domain_id=domain_id), page=AsyncOffsetPage[WaapDDOSAttack], options=make_request_options( extra_headers=extra_headers, @@ -408,7 +410,7 @@ def get_ddos_info( timeout: Override the client-level default timeout for this request, in seconds """ return self._get_api_list( - f"/waap/v1/domains/{domain_id}/ddos-info", + path_template("/waap/v1/domains/{domain_id}/ddos-info", domain_id=domain_id), page=AsyncOffsetPage[WaapDDOSInfo], options=make_request_options( extra_headers=extra_headers, @@ -474,7 +476,7 @@ async def get_events_aggregated( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/waap/v1/domains/{domain_id}/stats", + path_template("/waap/v1/domains/{domain_id}/stats", domain_id=domain_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -527,7 +529,9 @@ async def get_request_details( if not request_id: raise ValueError(f"Expected a non-empty value for `request_id` but received {request_id!r}") return await self._get( - f"/waap/v1/domains/{domain_id}/requests/{request_id}/details", + path_template( + "/waap/v1/domains/{domain_id}/requests/{request_id}/details", domain_id=domain_id, request_id=request_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/tests/test_utils/test_path.py b/tests/test_utils/test_path.py new file mode 100644 index 00000000..d4b7d6a3 --- /dev/null +++ b/tests/test_utils/test_path.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +from typing import Any + +import pytest + +from gcore._utils._path import path_template + + +@pytest.mark.parametrize( + "template, kwargs, expected", + [ + ("/v1/{id}", dict(id="abc"), "/v1/abc"), + ("/v1/{a}/{b}", dict(a="x", b="y"), "/v1/x/y"), + ("/v1/{a}{b}/path/{c}?val={d}#{e}", dict(a="x", b="y", c="z", d="u", e="v"), "/v1/xy/path/z?val=u#v"), + ("/{w}/{w}", dict(w="echo"), "/echo/echo"), + ("/v1/static", {}, "/v1/static"), + ("", {}, ""), + ("/v1/?q={n}&count=10", dict(n=42), "/v1/?q=42&count=10"), + ("/v1/{v}", dict(v=None), "/v1/null"), + ("/v1/{v}", dict(v=True), "/v1/true"), + ("/v1/{v}", dict(v=False), "/v1/false"), + ("/v1/{v}", dict(v=".hidden"), "/v1/.hidden"), # dot prefix ok + ("/v1/{v}", dict(v="file.txt"), "/v1/file.txt"), # dot in middle ok + ("/v1/{v}", dict(v="..."), "/v1/..."), # triple dot ok + ("/v1/{a}{b}", dict(a=".", b="txt"), "/v1/.txt"), # dot var combining with adjacent to be ok + ("/items?q={v}#{f}", dict(v=".", f=".."), "/items?q=.#.."), # dots in query/fragment are fine + ( + "/v1/{a}?query={b}", + dict(a="../../other/endpoint", b="a&bad=true"), + "/v1/..%2F..%2Fother%2Fendpoint?query=a%26bad%3Dtrue", + ), + ("/v1/{val}", dict(val="a/b/c"), "/v1/a%2Fb%2Fc"), + ("/v1/{val}", dict(val="a/b/c?query=value"), "/v1/a%2Fb%2Fc%3Fquery=value"), + ("/v1/{val}", dict(val="a/b/c?query=value&bad=true"), "/v1/a%2Fb%2Fc%3Fquery=value&bad=true"), + ("/v1/{val}", dict(val="%20"), "/v1/%2520"), # escapes escape sequences in input + # Query: slash and ? are safe, # is not + ("/items?q={v}", dict(v="a/b"), "/items?q=a/b"), + ("/items?q={v}", dict(v="a?b"), "/items?q=a?b"), + ("/items?q={v}", dict(v="a#b"), "/items?q=a%23b"), + ("/items?q={v}", dict(v="a b"), "/items?q=a%20b"), + # Fragment: slash and ? are safe + ("/docs#{v}", dict(v="a/b"), "/docs#a/b"), + ("/docs#{v}", dict(v="a?b"), "/docs#a?b"), + # Path: slash, ? and # are all encoded + ("/v1/{v}", dict(v="a/b"), "/v1/a%2Fb"), + ("/v1/{v}", dict(v="a?b"), "/v1/a%3Fb"), + ("/v1/{v}", dict(v="a#b"), "/v1/a%23b"), + # same var encoded differently by component + ( + "/v1/{v}?q={v}#{v}", + dict(v="a/b?c#d"), + "/v1/a%2Fb%3Fc%23d?q=a/b?c%23d#a/b?c%23d", + ), + ("/v1/{val}", dict(val="x?admin=true"), "/v1/x%3Fadmin=true"), # query injection + ("/v1/{val}", dict(val="x#admin"), "/v1/x%23admin"), # fragment injection + ], +) +def test_interpolation(template: str, kwargs: dict[str, Any], expected: str) -> None: + assert path_template(template, **kwargs) == expected + + +def test_missing_kwarg_raises_key_error() -> None: + with pytest.raises(KeyError, match="org_id"): + path_template("/v1/{org_id}") + + +@pytest.mark.parametrize( + "template, kwargs", + [ + ("{a}/path", dict(a=".")), + ("{a}/path", dict(a="..")), + ("/v1/{a}", dict(a=".")), + ("/v1/{a}", dict(a="..")), + ("/v1/{a}/path", dict(a=".")), + ("/v1/{a}/path", dict(a="..")), + ("/v1/{a}{b}", dict(a=".", b=".")), # adjacent vars → ".." + ("/v1/{a}.", dict(a=".")), # var + static → ".." + ("/v1/{a}{b}", dict(a="", b=".")), # empty + dot → "." + ("/v1/%2e/{x}", dict(x="ok")), # encoded dot in static text + ("/v1/%2e./{x}", dict(x="ok")), # mixed encoded ".." in static + ("/v1/.%2E/{x}", dict(x="ok")), # mixed encoded ".." in static + ("/v1/{v}?q=1", dict(v="..")), + ("/v1/{v}#frag", dict(v="..")), + ], +) +def test_dot_segment_rejected(template: str, kwargs: dict[str, Any]) -> None: + with pytest.raises(ValueError, match="dot-segment"): + path_template(template, **kwargs) From 28a7208e84d438e550556f8b41c1dca8f6283b95 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:03:13 +0000 Subject: [PATCH 16/25] refactor(tests): switch from prism to steady --- CONTRIBUTING.md | 2 +- scripts/mock | 26 +++++++++++++------------- scripts/test | 16 ++++++++-------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 75179408..9469eb3e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -85,7 +85,7 @@ $ pip install ./path-to-wheel-file.whl ## Running tests -Most tests require you to [set up a mock server](https://github.com/stoplightio/prism) against the OpenAPI spec to run the tests. +Most tests require you to [set up a mock server](https://github.com/dgellow/steady) against the OpenAPI spec to run the tests. ```sh $ ./scripts/mock diff --git a/scripts/mock b/scripts/mock index bcf3b392..5827de97 100755 --- a/scripts/mock +++ b/scripts/mock @@ -19,34 +19,34 @@ fi echo "==> Starting mock server with URL ${URL}" -# Run prism mock on the given spec +# Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism --version + npm exec --package=@stdy/cli@0.19.3 -- steady --version - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock "$URL" &> .prism.log & + npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=dots "$URL" &> .stdy.log & - # Wait for server to come online (max 30s) + # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" attempts=0 - while ! grep -q "✖ fatal\|Prism is listening" ".prism.log" ; do + while ! curl --silent --fail "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1; do + if ! kill -0 $! 2>/dev/null; then + echo + cat .stdy.log + exit 1 + fi attempts=$((attempts + 1)) if [ "$attempts" -ge 300 ]; then echo - echo "Timed out waiting for Prism server to start" - cat .prism.log + echo "Timed out waiting for Steady server to start" + cat .stdy.log exit 1 fi echo -n "." sleep 0.1 done - if grep -q "✖ fatal" ".prism.log"; then - cat .prism.log - exit 1 - fi - echo else - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock "$URL" + npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=dots "$URL" fi diff --git a/scripts/test b/scripts/test index d012c4bd..d9c389ac 100755 --- a/scripts/test +++ b/scripts/test @@ -9,8 +9,8 @@ GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' # No Color -function prism_is_running() { - curl --silent "http://localhost:4010" >/dev/null 2>&1 +function steady_is_running() { + curl --silent "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1 } kill_server_on_port() { @@ -25,7 +25,7 @@ function is_overriding_api_base_url() { [ -n "$TEST_API_BASE_URL" ] } -if ! is_overriding_api_base_url && ! prism_is_running ; then +if ! is_overriding_api_base_url && ! steady_is_running ; then # When we exit this script, make sure to kill the background mock server process trap 'kill_server_on_port 4010' EXIT @@ -36,19 +36,19 @@ fi if is_overriding_api_base_url ; then echo -e "${GREEN}✔ Running tests against ${TEST_API_BASE_URL}${NC}" echo -elif ! prism_is_running ; then - echo -e "${RED}ERROR:${NC} The test suite will not run without a mock Prism server" +elif ! steady_is_running ; then + echo -e "${RED}ERROR:${NC} The test suite will not run without a mock Steady server" echo -e "running against your OpenAPI spec." echo echo -e "To run the server, pass in the path or url of your OpenAPI" - echo -e "spec to the prism command:" + echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock path/to/your.openapi.yml${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.3 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=dots${NC}" echo exit 1 else - echo -e "${GREEN}✔ Mock prism server is running with your OpenAPI spec${NC}" + echo -e "${GREEN}✔ Mock steady server is running with your OpenAPI spec${NC}" echo fi From 998707ec275cc269044a347c5b858d460e2ae491 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 10:20:02 +0000 Subject: [PATCH 17/25] feat(api): aggregated API specs update --- .stats.yml | 4 ++-- .../resources/cloud/baremetal/servers.py | 14 ++++++++---- .../resources/cloud/instances/instances.py | 2 -- src/gcore/resources/cloud/tasks.py | 22 ++++++++++--------- src/gcore/types/cloud/task_list_params.py | 11 +++++----- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/.stats.yml b/.stats.yml index 67c04817..0cc0823b 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 652 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-a38b54906e3ed36b12af9f9cb5b74f9b758b6fa871caafdc83c01348bf8cfe9d.yml -openapi_spec_hash: a495cd5cd8f837c5c51e802d6b0d0970 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-c4c09a01a5791ea1d7c33e3c7ae09130b461848a881644003c4f0d7aaabef8b6.yml +openapi_spec_hash: 01f8b65e87e0dd05dec110fa43c4553f config_hash: f6f337c8c33376dd38969e7e3a8aecb0 diff --git a/src/gcore/resources/cloud/baremetal/servers.py b/src/gcore/resources/cloud/baremetal/servers.py index 172d6dbb..7a19a281 100644 --- a/src/gcore/resources/cloud/baremetal/servers.py +++ b/src/gcore/resources/cloud/baremetal/servers.py @@ -512,8 +512,11 @@ def get( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> BaremetalServer: - """ - Retrieve detailed information about a specific baremetal instance. + """Retrieve detailed information about a specific baremetal instance. + + This endpoint + always returns `ddos_profile` (if present) and therefore always requires + `DDOS_READ`. Args: project_id: Project ID @@ -1214,8 +1217,11 @@ async def get( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> BaremetalServer: - """ - Retrieve detailed information about a specific baremetal instance. + """Retrieve detailed information about a specific baremetal instance. + + This endpoint + always returns `ddos_profile` (if present) and therefore always requires + `DDOS_READ`. Args: project_id: Project ID diff --git a/src/gcore/resources/cloud/instances/instances.py b/src/gcore/resources/cloud/instances/instances.py index 2840d9d4..872fc835 100644 --- a/src/gcore/resources/cloud/instances/instances.py +++ b/src/gcore/resources/cloud/instances/instances.py @@ -1231,7 +1231,6 @@ def get( `ddos_profile` field. Supported values: - `'en'` (default) - `'de'` - - `'ru'` Args: project_id: Project ID @@ -2720,7 +2719,6 @@ async def get( `ddos_profile` field. Supported values: - `'en'` (default) - `'de'` - - `'ru'` Args: project_id: Project ID diff --git a/src/gcore/resources/cloud/tasks.py b/src/gcore/resources/cloud/tasks.py index 42121e2c..a362eaf0 100644 --- a/src/gcore/resources/cloud/tasks.py +++ b/src/gcore/resources/cloud/tasks.py @@ -142,11 +142,12 @@ def list( task_type: Filter the tasks by their type one of ['activate_ddos_profile', 'attach_bm_to_reserved_fixed_ip', 'attach_vm_interface', - 'attach_vm_to_reserved_fixed_ip', 'attach_volume', 'create_ai_cluster_gpu', - 'create_bm', 'create_caas_container', 'create_dbaas_postgres_cluster', - 'create_ddos_profile', 'create_faas_function', 'create_faas_namespace', - 'create_fip', 'create_gpu_virtual_cluster', 'create_image', - 'create_inference_application', 'create_inference_instance', + 'attach_vm_to_reserved_fixed_ip', 'attach_volume', + 'convert_fip_to_reserved_fixed_ip', 'convert_reserved_fixed_ip_to_fip', + 'create_ai_cluster_gpu', 'create_bm', 'create_caas_container', + 'create_dbaas_postgres_cluster', 'create_ddos_profile', 'create_faas_function', + 'create_faas_namespace', 'create_fip', 'create_gpu_virtual_cluster', + 'create_image', 'create_inference_application', 'create_inference_instance', 'create_k8s_cluster_pool_v2', 'create_k8s_cluster_v2', 'create_l7policy', 'create_l7rule', 'create_lblistener', 'create_lbmember', 'create_lbpool', 'create_lbpool_health_monitor', 'create_loadbalancer', 'create_network', @@ -462,11 +463,12 @@ def list( task_type: Filter the tasks by their type one of ['activate_ddos_profile', 'attach_bm_to_reserved_fixed_ip', 'attach_vm_interface', - 'attach_vm_to_reserved_fixed_ip', 'attach_volume', 'create_ai_cluster_gpu', - 'create_bm', 'create_caas_container', 'create_dbaas_postgres_cluster', - 'create_ddos_profile', 'create_faas_function', 'create_faas_namespace', - 'create_fip', 'create_gpu_virtual_cluster', 'create_image', - 'create_inference_application', 'create_inference_instance', + 'attach_vm_to_reserved_fixed_ip', 'attach_volume', + 'convert_fip_to_reserved_fixed_ip', 'convert_reserved_fixed_ip_to_fip', + 'create_ai_cluster_gpu', 'create_bm', 'create_caas_container', + 'create_dbaas_postgres_cluster', 'create_ddos_profile', 'create_faas_function', + 'create_faas_namespace', 'create_fip', 'create_gpu_virtual_cluster', + 'create_image', 'create_inference_application', 'create_inference_instance', 'create_k8s_cluster_pool_v2', 'create_k8s_cluster_v2', 'create_l7policy', 'create_l7rule', 'create_lblistener', 'create_lbmember', 'create_lbpool', 'create_lbpool_health_monitor', 'create_loadbalancer', 'create_network', diff --git a/src/gcore/types/cloud/task_list_params.py b/src/gcore/types/cloud/task_list_params.py index 1908fcca..9d63651c 100644 --- a/src/gcore/types/cloud/task_list_params.py +++ b/src/gcore/types/cloud/task_list_params.py @@ -61,11 +61,12 @@ class TaskListParams(TypedDict, total=False): """ Filter the tasks by their type one of ['activate_ddos_profile', 'attach_bm_to_reserved_fixed_ip', 'attach_vm_interface', - 'attach_vm_to_reserved_fixed_ip', 'attach_volume', 'create_ai_cluster_gpu', - 'create_bm', 'create_caas_container', 'create_dbaas_postgres_cluster', - 'create_ddos_profile', 'create_faas_function', 'create_faas_namespace', - 'create_fip', 'create_gpu_virtual_cluster', 'create_image', - 'create_inference_application', 'create_inference_instance', + 'attach_vm_to_reserved_fixed_ip', 'attach_volume', + 'convert_fip_to_reserved_fixed_ip', 'convert_reserved_fixed_ip_to_fip', + 'create_ai_cluster_gpu', 'create_bm', 'create_caas_container', + 'create_dbaas_postgres_cluster', 'create_ddos_profile', 'create_faas_function', + 'create_faas_namespace', 'create_fip', 'create_gpu_virtual_cluster', + 'create_image', 'create_inference_application', 'create_inference_instance', 'create_k8s_cluster_pool_v2', 'create_k8s_cluster_v2', 'create_l7policy', 'create_l7rule', 'create_lblistener', 'create_lbmember', 'create_lbpool', 'create_lbpool_health_monitor', 'create_loadbalancer', 'create_network', From 379eb58258a9f5e24d9108ed1efdeb3c68f2a4f4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 17:52:35 +0000 Subject: [PATCH 18/25] chore(tests): bump steady to v0.19.4 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 5827de97..afa43984 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.19.3 -- steady --version + npm exec --package=@stdy/cli@0.19.4 -- steady --version - npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=dots "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=dots "$URL" + npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots "$URL" fi diff --git a/scripts/test b/scripts/test index d9c389ac..de0b8d61 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.3 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=dots${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.4 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots${NC}" echo exit 1 From 660410fc9038c0dc349911ba9def7e1fa2aad3a7 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 21:41:34 +0000 Subject: [PATCH 19/25] chore(tests): bump steady to v0.19.5 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index afa43984..2f1753e4 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.19.4 -- steady --version + npm exec --package=@stdy/cli@0.19.5 -- steady --version - npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots "$URL" + npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots "$URL" fi diff --git a/scripts/test b/scripts/test index de0b8d61..6568816c 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.4 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.5 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots${NC}" echo exit 1 From 1c06ccaaf7d3256a1c33b53c6ca913700ed1da68 Mon Sep 17 00:00:00 2001 From: Pedro Oliveira <8281907+pedrodeoliveira@users.noreply.github.com> Date: Mon, 23 Mar 2026 11:45:58 +0000 Subject: [PATCH 20/25] feat(cloud): add create_and_poll and delete_and_poll methods for volume snapshots Both create and delete on volume snapshots return TaskIDList, forcing users to manually poll tasks. This adds convenience polling methods following the established pattern from volumes and instances/images. --- src/gcore/resources/cloud/volume_snapshots.py | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) diff --git a/src/gcore/resources/cloud/volume_snapshots.py b/src/gcore/resources/cloud/volume_snapshots.py index 9e38f471..0ea1594e 100644 --- a/src/gcore/resources/cloud/volume_snapshots.py +++ b/src/gcore/resources/cloud/volume_snapshots.py @@ -291,6 +291,92 @@ def get( cast_to=Snapshot, ) + def create_and_poll( + self, + *, + project_id: int | None = None, + region_id: int | None = None, + name: str, + volume_id: str, + description: str | Omit = omit, + tags: Dict[str, str] | Omit = omit, + polling_interval_seconds: int | Omit = omit, + polling_timeout_seconds: int | Omit = omit, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + ) -> Snapshot: + """Create a new snapshot from a volume and poll for the result. Only the first task will be polled. If you need to poll more tasks, use the `tasks.poll` method.""" + response = self.create( + project_id=project_id, + region_id=region_id, + name=name, + volume_id=volume_id, + description=description, + tags=tags, + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + ) + if not response.tasks: + raise ValueError("Expected at least one task to be created") + task = self._client.cloud.tasks.poll( + task_id=response.tasks[0], + extra_headers=extra_headers, + polling_interval_seconds=polling_interval_seconds, + polling_timeout_seconds=polling_timeout_seconds, + ) + if task.created_resources is None or task.created_resources.snapshots is None or len(task.created_resources.snapshots) != 1: + raise ValueError("Task completed but created_resources or snapshots is missing or invalid") + created_snapshot_id = task.created_resources.snapshots[0] + return self.get( + snapshot_id=created_snapshot_id, + project_id=project_id, + region_id=region_id, + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + ) + + def delete_and_poll( + self, + snapshot_id: str, + *, + project_id: int | None = None, + region_id: int | None = None, + polling_interval_seconds: int | Omit = omit, + polling_timeout_seconds: int | Omit = omit, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + ) -> None: + """Delete a specific snapshot and poll for the result. Only the first task will be polled. If you need to poll more tasks, use the `tasks.poll` method.""" + response = self.delete( + snapshot_id=snapshot_id, + project_id=project_id, + region_id=region_id, + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + ) + if not response.tasks: + raise ValueError("Expected at least one task to be created") + self._client.cloud.tasks.poll( + task_id=response.tasks[0], + extra_headers=extra_headers, + polling_interval_seconds=polling_interval_seconds, + polling_timeout_seconds=polling_timeout_seconds, + ) + class AsyncVolumeSnapshotsResource(AsyncAPIResource): @cached_property @@ -558,6 +644,92 @@ async def get( cast_to=Snapshot, ) + async def create_and_poll( + self, + *, + project_id: int | None = None, + region_id: int | None = None, + name: str, + volume_id: str, + description: str | Omit = omit, + tags: Dict[str, str] | Omit = omit, + polling_interval_seconds: int | Omit = omit, + polling_timeout_seconds: int | Omit = omit, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + ) -> Snapshot: + """Create a new snapshot from a volume and poll for the result. Only the first task will be polled. If you need to poll more tasks, use the `tasks.poll` method.""" + response = await self.create( + project_id=project_id, + region_id=region_id, + name=name, + volume_id=volume_id, + description=description, + tags=tags, + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + ) + if not response.tasks: + raise ValueError("Expected at least one task to be created") + task = await self._client.cloud.tasks.poll( + task_id=response.tasks[0], + extra_headers=extra_headers, + polling_interval_seconds=polling_interval_seconds, + polling_timeout_seconds=polling_timeout_seconds, + ) + if task.created_resources is None or task.created_resources.snapshots is None or len(task.created_resources.snapshots) != 1: + raise ValueError("Task completed but created_resources or snapshots is missing or invalid") + created_snapshot_id = task.created_resources.snapshots[0] + return await self.get( + snapshot_id=created_snapshot_id, + project_id=project_id, + region_id=region_id, + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + ) + + async def delete_and_poll( + self, + snapshot_id: str, + *, + project_id: int | None = None, + region_id: int | None = None, + polling_interval_seconds: int | Omit = omit, + polling_timeout_seconds: int | Omit = omit, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + ) -> None: + """Delete a specific snapshot and poll for the result. Only the first task will be polled. If you need to poll more tasks, use the `tasks.poll` method.""" + response = await self.delete( + snapshot_id=snapshot_id, + project_id=project_id, + region_id=region_id, + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + ) + if not response.tasks: + raise ValueError("Expected at least one task to be created") + await self._client.cloud.tasks.poll( + task_id=response.tasks[0], + extra_headers=extra_headers, + polling_interval_seconds=polling_interval_seconds, + polling_timeout_seconds=polling_timeout_seconds, + ) + class VolumeSnapshotsResourceWithRawResponse: def __init__(self, volume_snapshots: VolumeSnapshotsResource) -> None: @@ -575,6 +747,12 @@ def __init__(self, volume_snapshots: VolumeSnapshotsResource) -> None: self.get = to_raw_response_wrapper( volume_snapshots.get, ) + self.create_and_poll = to_raw_response_wrapper( + volume_snapshots.create_and_poll, + ) + self.delete_and_poll = to_raw_response_wrapper( + volume_snapshots.delete_and_poll, + ) class AsyncVolumeSnapshotsResourceWithRawResponse: @@ -593,6 +771,12 @@ def __init__(self, volume_snapshots: AsyncVolumeSnapshotsResource) -> None: self.get = async_to_raw_response_wrapper( volume_snapshots.get, ) + self.create_and_poll = async_to_raw_response_wrapper( + volume_snapshots.create_and_poll, + ) + self.delete_and_poll = async_to_raw_response_wrapper( + volume_snapshots.delete_and_poll, + ) class VolumeSnapshotsResourceWithStreamingResponse: @@ -611,6 +795,12 @@ def __init__(self, volume_snapshots: VolumeSnapshotsResource) -> None: self.get = to_streamed_response_wrapper( volume_snapshots.get, ) + self.create_and_poll = to_streamed_response_wrapper( + volume_snapshots.create_and_poll, + ) + self.delete_and_poll = to_streamed_response_wrapper( + volume_snapshots.delete_and_poll, + ) class AsyncVolumeSnapshotsResourceWithStreamingResponse: @@ -629,3 +819,9 @@ def __init__(self, volume_snapshots: AsyncVolumeSnapshotsResource) -> None: self.get = async_to_streamed_response_wrapper( volume_snapshots.get, ) + self.create_and_poll = async_to_streamed_response_wrapper( + volume_snapshots.create_and_poll, + ) + self.delete_and_poll = async_to_streamed_response_wrapper( + volume_snapshots.delete_and_poll, + ) From 7a2de3750cd3737cbbbc0ba0d3317c08368345a8 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 11:56:57 +0000 Subject: [PATCH 21/25] feat(cloud): add notification_threshold subresource to quotas --- .stats.yml | 4 +- src/gcore/resources/cloud/api.md | 14 + src/gcore/resources/cloud/quotas/__init__.py | 14 + .../cloud/quotas/notification_threshold.py | 376 ++++ src/gcore/resources/cloud/quotas/quotas.py | 32 + src/gcore/types/cloud/quotas/__init__.py | 2 + .../cloud/quotas/notification_threshold.py | 1645 +++++++++++++++++ .../notification_threshold_update_params.py | 1645 +++++++++++++++++ .../quotas/test_notification_threshold.py | 1166 ++++++++++++ 9 files changed, 4896 insertions(+), 2 deletions(-) create mode 100644 src/gcore/resources/cloud/quotas/notification_threshold.py create mode 100644 src/gcore/types/cloud/quotas/notification_threshold.py create mode 100644 src/gcore/types/cloud/quotas/notification_threshold_update_params.py create mode 100644 tests/api_resources/cloud/quotas/test_notification_threshold.py diff --git a/.stats.yml b/.stats.yml index 0cc0823b..ea487e6e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 652 +configured_endpoints: 655 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-c4c09a01a5791ea1d7c33e3c7ae09130b461848a881644003c4f0d7aaabef8b6.yml openapi_spec_hash: 01f8b65e87e0dd05dec110fa43c4553f -config_hash: f6f337c8c33376dd38969e7e3a8aecb0 +config_hash: f5f1fe25a10b69d0a7dd45d73ee52a15 diff --git a/src/gcore/resources/cloud/api.md b/src/gcore/resources/cloud/api.md index 2df19bef..fb309d36 100644 --- a/src/gcore/resources/cloud/api.md +++ b/src/gcore/resources/cloud/api.md @@ -129,6 +129,20 @@ Methods: - client.cloud.quotas.requests.delete(request_id) -> None - client.cloud.quotas.requests.get(request_id) -> RequestGetResponse +### NotificationThreshold + +Types: + +```python +from gcore.types.cloud.quotas import NotificationThreshold +``` + +Methods: + +- client.cloud.quotas.notification_threshold.update(client_id, \*\*params) -> NotificationThreshold +- client.cloud.quotas.notification_threshold.delete(client_id) -> None +- client.cloud.quotas.notification_threshold.get(client_id) -> NotificationThreshold + ## Secrets Types: diff --git a/src/gcore/resources/cloud/quotas/__init__.py b/src/gcore/resources/cloud/quotas/__init__.py index 5d09d00d..5cb9bfbf 100644 --- a/src/gcore/resources/cloud/quotas/__init__.py +++ b/src/gcore/resources/cloud/quotas/__init__.py @@ -16,6 +16,14 @@ RequestsResourceWithStreamingResponse, AsyncRequestsResourceWithStreamingResponse, ) +from .notification_threshold import ( + NotificationThresholdResource, + AsyncNotificationThresholdResource, + NotificationThresholdResourceWithRawResponse, + AsyncNotificationThresholdResourceWithRawResponse, + NotificationThresholdResourceWithStreamingResponse, + AsyncNotificationThresholdResourceWithStreamingResponse, +) __all__ = [ "RequestsResource", @@ -24,6 +32,12 @@ "AsyncRequestsResourceWithRawResponse", "RequestsResourceWithStreamingResponse", "AsyncRequestsResourceWithStreamingResponse", + "NotificationThresholdResource", + "AsyncNotificationThresholdResource", + "NotificationThresholdResourceWithRawResponse", + "AsyncNotificationThresholdResourceWithRawResponse", + "NotificationThresholdResourceWithStreamingResponse", + "AsyncNotificationThresholdResourceWithStreamingResponse", "QuotasResource", "AsyncQuotasResource", "QuotasResourceWithRawResponse", diff --git a/src/gcore/resources/cloud/quotas/notification_threshold.py b/src/gcore/resources/cloud/quotas/notification_threshold.py new file mode 100644 index 00000000..0a3f3a08 --- /dev/null +++ b/src/gcore/resources/cloud/quotas/notification_threshold.py @@ -0,0 +1,376 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Union, Optional +from datetime import datetime + +import httpx + +from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given +from ...._utils import path_template, maybe_transform, async_maybe_transform +from ...._compat import cached_property +from ...._resource import SyncAPIResource, AsyncAPIResource +from ...._response import ( + to_raw_response_wrapper, + to_streamed_response_wrapper, + async_to_raw_response_wrapper, + async_to_streamed_response_wrapper, +) +from ...._base_client import make_request_options +from ....types.cloud.quotas import notification_threshold_update_params +from ....types.cloud.quotas.notification_threshold import NotificationThreshold + +__all__ = ["NotificationThresholdResource", "AsyncNotificationThresholdResource"] + + +class NotificationThresholdResource(SyncAPIResource): + @cached_property + def with_raw_response(self) -> NotificationThresholdResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/G-Core/gcore-python#accessing-raw-response-data-eg-headers + """ + return NotificationThresholdResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> NotificationThresholdResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/G-Core/gcore-python#with_streaming_response + """ + return NotificationThresholdResourceWithStreamingResponse(self) + + def update( + self, + client_id: int, + *, + threshold: int, + last_message: Optional[notification_threshold_update_params.LastMessage] | Omit = omit, + last_sending: Union[str, datetime, None] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> NotificationThreshold: + """Update or create a client's quota notification threshold. + + This threshold is used + to send warning notifications to the client when their quota usage reaches the + specified percentage. Defaults to 80%. + + Args: + client_id: Client ID + + threshold: Quota notification threshold in percentage + + last_message: A message data + + last_sending: Time of last successful email sending + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._put( + path_template("/cloud/v2/client_quotas/{client_id}/notification_threshold", client_id=client_id), + body=maybe_transform( + { + "threshold": threshold, + "last_message": last_message, + "last_sending": last_sending, + }, + notification_threshold_update_params.NotificationThresholdUpdateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NotificationThreshold, + ) + + def delete( + self, + client_id: int, + *, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> None: + """Delete a client's quota notification threshold. + + After deletion, the default + threshold of 80% will be used. + + Args: + client_id: Client ID + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + extra_headers = {"Accept": "*/*", **(extra_headers or {})} + return self._delete( + path_template("/cloud/v2/client_quotas/{client_id}/notification_threshold", client_id=client_id), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NoneType, + ) + + def get( + self, + client_id: int, + *, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> NotificationThreshold: + """Get a client's quota notification threshold. + + This threshold is used to send + warning notifications to the client when their quota usage reaches the specified + percentage. Defaults to 80% if not set. + + Args: + client_id: Client ID + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._get( + path_template("/cloud/v2/client_quotas/{client_id}/notification_threshold", client_id=client_id), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NotificationThreshold, + ) + + +class AsyncNotificationThresholdResource(AsyncAPIResource): + @cached_property + def with_raw_response(self) -> AsyncNotificationThresholdResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/G-Core/gcore-python#accessing-raw-response-data-eg-headers + """ + return AsyncNotificationThresholdResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncNotificationThresholdResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/G-Core/gcore-python#with_streaming_response + """ + return AsyncNotificationThresholdResourceWithStreamingResponse(self) + + async def update( + self, + client_id: int, + *, + threshold: int, + last_message: Optional[notification_threshold_update_params.LastMessage] | Omit = omit, + last_sending: Union[str, datetime, None] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> NotificationThreshold: + """Update or create a client's quota notification threshold. + + This threshold is used + to send warning notifications to the client when their quota usage reaches the + specified percentage. Defaults to 80%. + + Args: + client_id: Client ID + + threshold: Quota notification threshold in percentage + + last_message: A message data + + last_sending: Time of last successful email sending + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return await self._put( + path_template("/cloud/v2/client_quotas/{client_id}/notification_threshold", client_id=client_id), + body=await async_maybe_transform( + { + "threshold": threshold, + "last_message": last_message, + "last_sending": last_sending, + }, + notification_threshold_update_params.NotificationThresholdUpdateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NotificationThreshold, + ) + + async def delete( + self, + client_id: int, + *, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> None: + """Delete a client's quota notification threshold. + + After deletion, the default + threshold of 80% will be used. + + Args: + client_id: Client ID + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + extra_headers = {"Accept": "*/*", **(extra_headers or {})} + return await self._delete( + path_template("/cloud/v2/client_quotas/{client_id}/notification_threshold", client_id=client_id), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NoneType, + ) + + async def get( + self, + client_id: int, + *, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> NotificationThreshold: + """Get a client's quota notification threshold. + + This threshold is used to send + warning notifications to the client when their quota usage reaches the specified + percentage. Defaults to 80% if not set. + + Args: + client_id: Client ID + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return await self._get( + path_template("/cloud/v2/client_quotas/{client_id}/notification_threshold", client_id=client_id), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NotificationThreshold, + ) + + +class NotificationThresholdResourceWithRawResponse: + def __init__(self, notification_threshold: NotificationThresholdResource) -> None: + self._notification_threshold = notification_threshold + + self.update = to_raw_response_wrapper( + notification_threshold.update, + ) + self.delete = to_raw_response_wrapper( + notification_threshold.delete, + ) + self.get = to_raw_response_wrapper( + notification_threshold.get, + ) + + +class AsyncNotificationThresholdResourceWithRawResponse: + def __init__(self, notification_threshold: AsyncNotificationThresholdResource) -> None: + self._notification_threshold = notification_threshold + + self.update = async_to_raw_response_wrapper( + notification_threshold.update, + ) + self.delete = async_to_raw_response_wrapper( + notification_threshold.delete, + ) + self.get = async_to_raw_response_wrapper( + notification_threshold.get, + ) + + +class NotificationThresholdResourceWithStreamingResponse: + def __init__(self, notification_threshold: NotificationThresholdResource) -> None: + self._notification_threshold = notification_threshold + + self.update = to_streamed_response_wrapper( + notification_threshold.update, + ) + self.delete = to_streamed_response_wrapper( + notification_threshold.delete, + ) + self.get = to_streamed_response_wrapper( + notification_threshold.get, + ) + + +class AsyncNotificationThresholdResourceWithStreamingResponse: + def __init__(self, notification_threshold: AsyncNotificationThresholdResource) -> None: + self._notification_threshold = notification_threshold + + self.update = async_to_streamed_response_wrapper( + notification_threshold.update, + ) + self.delete = async_to_streamed_response_wrapper( + notification_threshold.delete, + ) + self.get = async_to_streamed_response_wrapper( + notification_threshold.get, + ) diff --git a/src/gcore/resources/cloud/quotas/quotas.py b/src/gcore/resources/cloud/quotas/quotas.py index 1e0b2f9b..6d9f3b24 100644 --- a/src/gcore/resources/cloud/quotas/quotas.py +++ b/src/gcore/resources/cloud/quotas/quotas.py @@ -23,6 +23,14 @@ async_to_streamed_response_wrapper, ) from ...._base_client import make_request_options +from .notification_threshold import ( + NotificationThresholdResource, + AsyncNotificationThresholdResource, + NotificationThresholdResourceWithRawResponse, + AsyncNotificationThresholdResourceWithRawResponse, + NotificationThresholdResourceWithStreamingResponse, + AsyncNotificationThresholdResourceWithStreamingResponse, +) from ....types.cloud.quota_get_all_response import QuotaGetAllResponse from ....types.cloud.quota_get_global_response import QuotaGetGlobalResponse from ....types.cloud.quota_get_by_region_response import QuotaGetByRegionResponse @@ -35,6 +43,10 @@ class QuotasResource(SyncAPIResource): def requests(self) -> RequestsResource: return RequestsResource(self._client) + @cached_property + def notification_threshold(self) -> NotificationThresholdResource: + return NotificationThresholdResource(self._client) + @cached_property def with_raw_response(self) -> QuotasResourceWithRawResponse: """ @@ -152,6 +164,10 @@ class AsyncQuotasResource(AsyncAPIResource): def requests(self) -> AsyncRequestsResource: return AsyncRequestsResource(self._client) + @cached_property + def notification_threshold(self) -> AsyncNotificationThresholdResource: + return AsyncNotificationThresholdResource(self._client) + @cached_property def with_raw_response(self) -> AsyncQuotasResourceWithRawResponse: """ @@ -282,6 +298,10 @@ def __init__(self, quotas: QuotasResource) -> None: def requests(self) -> RequestsResourceWithRawResponse: return RequestsResourceWithRawResponse(self._quotas.requests) + @cached_property + def notification_threshold(self) -> NotificationThresholdResourceWithRawResponse: + return NotificationThresholdResourceWithRawResponse(self._quotas.notification_threshold) + class AsyncQuotasResourceWithRawResponse: def __init__(self, quotas: AsyncQuotasResource) -> None: @@ -301,6 +321,10 @@ def __init__(self, quotas: AsyncQuotasResource) -> None: def requests(self) -> AsyncRequestsResourceWithRawResponse: return AsyncRequestsResourceWithRawResponse(self._quotas.requests) + @cached_property + def notification_threshold(self) -> AsyncNotificationThresholdResourceWithRawResponse: + return AsyncNotificationThresholdResourceWithRawResponse(self._quotas.notification_threshold) + class QuotasResourceWithStreamingResponse: def __init__(self, quotas: QuotasResource) -> None: @@ -320,6 +344,10 @@ def __init__(self, quotas: QuotasResource) -> None: def requests(self) -> RequestsResourceWithStreamingResponse: return RequestsResourceWithStreamingResponse(self._quotas.requests) + @cached_property + def notification_threshold(self) -> NotificationThresholdResourceWithStreamingResponse: + return NotificationThresholdResourceWithStreamingResponse(self._quotas.notification_threshold) + class AsyncQuotasResourceWithStreamingResponse: def __init__(self, quotas: AsyncQuotasResource) -> None: @@ -338,3 +366,7 @@ def __init__(self, quotas: AsyncQuotasResource) -> None: @cached_property def requests(self) -> AsyncRequestsResourceWithStreamingResponse: return AsyncRequestsResourceWithStreamingResponse(self._quotas.requests) + + @cached_property + def notification_threshold(self) -> AsyncNotificationThresholdResourceWithStreamingResponse: + return AsyncNotificationThresholdResourceWithStreamingResponse(self._quotas.notification_threshold) diff --git a/src/gcore/types/cloud/quotas/__init__.py b/src/gcore/types/cloud/quotas/__init__.py index 600a55cb..59c62c28 100644 --- a/src/gcore/types/cloud/quotas/__init__.py +++ b/src/gcore/types/cloud/quotas/__init__.py @@ -6,3 +6,5 @@ from .request_get_response import RequestGetResponse as RequestGetResponse from .request_create_params import RequestCreateParams as RequestCreateParams from .request_list_response import RequestListResponse as RequestListResponse +from .notification_threshold import NotificationThreshold as NotificationThreshold +from .notification_threshold_update_params import NotificationThresholdUpdateParams as NotificationThresholdUpdateParams diff --git a/src/gcore/types/cloud/quotas/notification_threshold.py b/src/gcore/types/cloud/quotas/notification_threshold.py new file mode 100644 index 00000000..9206da50 --- /dev/null +++ b/src/gcore/types/cloud/quotas/notification_threshold.py @@ -0,0 +1,1645 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Optional +from datetime import datetime + +from ...._models import BaseModel + +__all__ = [ + "NotificationThreshold", + "LastMessage", + "LastMessageGlobalQuotas", + "LastMessageGlobalQuotasInferenceCPUMillicoreCountLimit", + "LastMessageGlobalQuotasInferenceCPUMillicoreCountUsage", + "LastMessageGlobalQuotasInferenceGPUA100CountLimit", + "LastMessageGlobalQuotasInferenceGPUA100CountUsage", + "LastMessageGlobalQuotasInferenceGPUH100CountLimit", + "LastMessageGlobalQuotasInferenceGPUH100CountUsage", + "LastMessageGlobalQuotasInferenceGPUL40sCountLimit", + "LastMessageGlobalQuotasInferenceGPUL40sCountUsage", + "LastMessageGlobalQuotasInferenceInstanceCountLimit", + "LastMessageGlobalQuotasInferenceInstanceCountUsage", + "LastMessageGlobalQuotasKeypairCountLimit", + "LastMessageGlobalQuotasKeypairCountUsage", + "LastMessageGlobalQuotasProjectCountLimit", + "LastMessageGlobalQuotasProjectCountUsage", + "LastMessageRegionalQuota", + "LastMessageRegionalQuotaBaremetalBasicCountLimit", + "LastMessageRegionalQuotaBaremetalBasicCountUsage", + "LastMessageRegionalQuotaBaremetalGPUA100CountLimit", + "LastMessageRegionalQuotaBaremetalGPUA100CountUsage", + "LastMessageRegionalQuotaBaremetalGPUH100CountLimit", + "LastMessageRegionalQuotaBaremetalGPUH100CountUsage", + "LastMessageRegionalQuotaBaremetalGPUH200CountLimit", + "LastMessageRegionalQuotaBaremetalGPUH200CountUsage", + "LastMessageRegionalQuotaBaremetalGPUL40sCountLimit", + "LastMessageRegionalQuotaBaremetalGPUL40sCountUsage", + "LastMessageRegionalQuotaBaremetalHfCountLimit", + "LastMessageRegionalQuotaBaremetalHfCountUsage", + "LastMessageRegionalQuotaBaremetalInfrastructureCountLimit", + "LastMessageRegionalQuotaBaremetalInfrastructureCountUsage", + "LastMessageRegionalQuotaBaremetalNetworkCountLimit", + "LastMessageRegionalQuotaBaremetalNetworkCountUsage", + "LastMessageRegionalQuotaBaremetalStorageCountLimit", + "LastMessageRegionalQuotaBaremetalStorageCountUsage", + "LastMessageRegionalQuotaCaasContainerCountLimit", + "LastMessageRegionalQuotaCaasContainerCountUsage", + "LastMessageRegionalQuotaCaasCPUCountLimit", + "LastMessageRegionalQuotaCaasCPUCountUsage", + "LastMessageRegionalQuotaCaasGPUCountLimit", + "LastMessageRegionalQuotaCaasGPUCountUsage", + "LastMessageRegionalQuotaCaasRamSizeLimit", + "LastMessageRegionalQuotaCaasRamSizeUsage", + "LastMessageRegionalQuotaClusterCountLimit", + "LastMessageRegionalQuotaClusterCountUsage", + "LastMessageRegionalQuotaCPUCountLimit", + "LastMessageRegionalQuotaCPUCountUsage", + "LastMessageRegionalQuotaDbaasPostgresClusterCountLimit", + "LastMessageRegionalQuotaDbaasPostgresClusterCountUsage", + "LastMessageRegionalQuotaExternalIPCountLimit", + "LastMessageRegionalQuotaExternalIPCountUsage", + "LastMessageRegionalQuotaFaasCPUCountLimit", + "LastMessageRegionalQuotaFaasCPUCountUsage", + "LastMessageRegionalQuotaFaasFunctionCountLimit", + "LastMessageRegionalQuotaFaasFunctionCountUsage", + "LastMessageRegionalQuotaFaasNamespaceCountLimit", + "LastMessageRegionalQuotaFaasNamespaceCountUsage", + "LastMessageRegionalQuotaFaasRamSizeLimit", + "LastMessageRegionalQuotaFaasRamSizeUsage", + "LastMessageRegionalQuotaFirewallCountLimit", + "LastMessageRegionalQuotaFirewallCountUsage", + "LastMessageRegionalQuotaFloatingCountLimit", + "LastMessageRegionalQuotaFloatingCountUsage", + "LastMessageRegionalQuotaGPUCountLimit", + "LastMessageRegionalQuotaGPUCountUsage", + "LastMessageRegionalQuotaGPUVirtualA100CountLimit", + "LastMessageRegionalQuotaGPUVirtualA100CountUsage", + "LastMessageRegionalQuotaGPUVirtualH100CountLimit", + "LastMessageRegionalQuotaGPUVirtualH100CountUsage", + "LastMessageRegionalQuotaGPUVirtualH200CountLimit", + "LastMessageRegionalQuotaGPUVirtualH200CountUsage", + "LastMessageRegionalQuotaGPUVirtualL40sCountLimit", + "LastMessageRegionalQuotaGPUVirtualL40sCountUsage", + "LastMessageRegionalQuotaImageCountLimit", + "LastMessageRegionalQuotaImageCountUsage", + "LastMessageRegionalQuotaImageSizeLimit", + "LastMessageRegionalQuotaImageSizeUsage", + "LastMessageRegionalQuotaIpuCountLimit", + "LastMessageRegionalQuotaIpuCountUsage", + "LastMessageRegionalQuotaLaasTopicCountLimit", + "LastMessageRegionalQuotaLaasTopicCountUsage", + "LastMessageRegionalQuotaLoadbalancerCountLimit", + "LastMessageRegionalQuotaLoadbalancerCountUsage", + "LastMessageRegionalQuotaNetworkCountLimit", + "LastMessageRegionalQuotaNetworkCountUsage", + "LastMessageRegionalQuotaRamLimit", + "LastMessageRegionalQuotaRamUsage", + "LastMessageRegionalQuotaRegistryCountLimit", + "LastMessageRegionalQuotaRegistryCountUsage", + "LastMessageRegionalQuotaRegistryStorageLimit", + "LastMessageRegionalQuotaRegistryStorageUsage", + "LastMessageRegionalQuotaRouterCountLimit", + "LastMessageRegionalQuotaRouterCountUsage", + "LastMessageRegionalQuotaSecretCountLimit", + "LastMessageRegionalQuotaSecretCountUsage", + "LastMessageRegionalQuotaServergroupCountLimit", + "LastMessageRegionalQuotaServergroupCountUsage", + "LastMessageRegionalQuotaSfsCountLimit", + "LastMessageRegionalQuotaSfsCountUsage", + "LastMessageRegionalQuotaSfsSizeLimit", + "LastMessageRegionalQuotaSfsSizeUsage", + "LastMessageRegionalQuotaSharedVmCountLimit", + "LastMessageRegionalQuotaSharedVmCountUsage", + "LastMessageRegionalQuotaSnapshotScheduleCountLimit", + "LastMessageRegionalQuotaSnapshotScheduleCountUsage", + "LastMessageRegionalQuotaSubnetCountLimit", + "LastMessageRegionalQuotaSubnetCountUsage", + "LastMessageRegionalQuotaVmCountLimit", + "LastMessageRegionalQuotaVmCountUsage", + "LastMessageRegionalQuotaVolumeCountLimit", + "LastMessageRegionalQuotaVolumeCountUsage", + "LastMessageRegionalQuotaVolumeSizeLimit", + "LastMessageRegionalQuotaVolumeSizeUsage", + "LastMessageRegionalQuotaVolumeSnapshotsCountLimit", + "LastMessageRegionalQuotaVolumeSnapshotsCountUsage", + "LastMessageRegionalQuotaVolumeSnapshotsSizeLimit", + "LastMessageRegionalQuotaVolumeSnapshotsSizeUsage", +] + + +class LastMessageGlobalQuotasInferenceCPUMillicoreCountLimit(BaseModel): + """Inference CPU millicore count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceCPUMillicoreCountUsage(BaseModel): + """Inference CPU millicore count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUA100CountLimit(BaseModel): + """Inference GPU A100 Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUA100CountUsage(BaseModel): + """Inference GPU A100 Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUH100CountLimit(BaseModel): + """Inference GPU H100 Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUH100CountUsage(BaseModel): + """Inference GPU H100 Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUL40sCountLimit(BaseModel): + """Inference GPU L40s Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUL40sCountUsage(BaseModel): + """Inference GPU L40s Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceInstanceCountLimit(BaseModel): + """Inference instance count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceInstanceCountUsage(BaseModel): + """Inference instance count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasKeypairCountLimit(BaseModel): + """SSH Keys Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasKeypairCountUsage(BaseModel): + """SSH Keys Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasProjectCountLimit(BaseModel): + """Projects Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasProjectCountUsage(BaseModel): + """Projects Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotas(BaseModel): + """Global quota that exceed the threshold""" + + inference_cpu_millicore_count_limit: Optional[LastMessageGlobalQuotasInferenceCPUMillicoreCountLimit] = None + """Inference CPU millicore count limit""" + + inference_cpu_millicore_count_usage: Optional[LastMessageGlobalQuotasInferenceCPUMillicoreCountUsage] = None + """Inference CPU millicore count usage""" + + inference_gpu_a100_count_limit: Optional[LastMessageGlobalQuotasInferenceGPUA100CountLimit] = None + """Inference GPU A100 Count limit""" + + inference_gpu_a100_count_usage: Optional[LastMessageGlobalQuotasInferenceGPUA100CountUsage] = None + """Inference GPU A100 Count usage""" + + inference_gpu_h100_count_limit: Optional[LastMessageGlobalQuotasInferenceGPUH100CountLimit] = None + """Inference GPU H100 Count limit""" + + inference_gpu_h100_count_usage: Optional[LastMessageGlobalQuotasInferenceGPUH100CountUsage] = None + """Inference GPU H100 Count usage""" + + inference_gpu_l40s_count_limit: Optional[LastMessageGlobalQuotasInferenceGPUL40sCountLimit] = None + """Inference GPU L40s Count limit""" + + inference_gpu_l40s_count_usage: Optional[LastMessageGlobalQuotasInferenceGPUL40sCountUsage] = None + """Inference GPU L40s Count usage""" + + inference_instance_count_limit: Optional[LastMessageGlobalQuotasInferenceInstanceCountLimit] = None + """Inference instance count limit""" + + inference_instance_count_usage: Optional[LastMessageGlobalQuotasInferenceInstanceCountUsage] = None + """Inference instance count usage""" + + keypair_count_limit: Optional[LastMessageGlobalQuotasKeypairCountLimit] = None + """SSH Keys Count limit""" + + keypair_count_usage: Optional[LastMessageGlobalQuotasKeypairCountUsage] = None + """SSH Keys Count usage""" + + project_count_limit: Optional[LastMessageGlobalQuotasProjectCountLimit] = None + """Projects Count limit""" + + project_count_usage: Optional[LastMessageGlobalQuotasProjectCountUsage] = None + """Projects Count usage""" + + +class LastMessageRegionalQuotaBaremetalBasicCountLimit(BaseModel): + """Basic bare metal servers count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalBasicCountUsage(BaseModel): + """Basic bare metal servers count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUA100CountLimit(BaseModel): + """Bare metal A100 GPU server count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUA100CountUsage(BaseModel): + """Bare metal A100 GPU server count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUH100CountLimit(BaseModel): + """Bare metal H100 GPU server count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUH100CountUsage(BaseModel): + """Bare metal H100 GPU server count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUH200CountLimit(BaseModel): + """Bare metal H200 GPU server count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUH200CountUsage(BaseModel): + """Bare metal H200 GPU server count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUL40sCountLimit(BaseModel): + """Bare metal L40S GPU server count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUL40sCountUsage(BaseModel): + """Bare metal L40S GPU server count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalHfCountLimit(BaseModel): + """High-frequency bare metal servers count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalHfCountUsage(BaseModel): + """High-frequency bare metal servers count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalInfrastructureCountLimit(BaseModel): + """Infrastructure bare metal servers count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalInfrastructureCountUsage(BaseModel): + """Infrastructure bare metal servers count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalNetworkCountLimit(BaseModel): + """Bare metal Network Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalNetworkCountUsage(BaseModel): + """Bare metal Network Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalStorageCountLimit(BaseModel): + """Storage bare metal servers count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalStorageCountUsage(BaseModel): + """Storage bare metal servers count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasContainerCountLimit(BaseModel): + """Containers count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasContainerCountUsage(BaseModel): + """Containers count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasCPUCountLimit(BaseModel): + """mCPU count for containers limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasCPUCountUsage(BaseModel): + """mCPU count for containers usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasGPUCountLimit(BaseModel): + """Containers gpu count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasGPUCountUsage(BaseModel): + """Containers gpu count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasRamSizeLimit(BaseModel): + """MiB memory count for containers limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasRamSizeUsage(BaseModel): + """MiB memory count for containers usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaClusterCountLimit(BaseModel): + """K8s clusters count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaClusterCountUsage(BaseModel): + """K8s clusters count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCPUCountLimit(BaseModel): + """vCPU Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCPUCountUsage(BaseModel): + """vCPU Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaDbaasPostgresClusterCountLimit(BaseModel): + """DBaaS cluster count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaDbaasPostgresClusterCountUsage(BaseModel): + """DBaaS cluster count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaExternalIPCountLimit(BaseModel): + """External IP Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaExternalIPCountUsage(BaseModel): + """External IP Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasCPUCountLimit(BaseModel): + """mCPU count for functions limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasCPUCountUsage(BaseModel): + """mCPU count for functions usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasFunctionCountLimit(BaseModel): + """Functions count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasFunctionCountUsage(BaseModel): + """Functions count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasNamespaceCountLimit(BaseModel): + """Functions namespace count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasNamespaceCountUsage(BaseModel): + """Functions namespace count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasRamSizeLimit(BaseModel): + """MiB memory count for functions limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasRamSizeUsage(BaseModel): + """MiB memory count for functions usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFirewallCountLimit(BaseModel): + """Firewalls Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFirewallCountUsage(BaseModel): + """Firewalls Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFloatingCountLimit(BaseModel): + """Floating IP Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFloatingCountUsage(BaseModel): + """Floating IP Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUCountLimit(BaseModel): + """GPU Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUCountUsage(BaseModel): + """GPU Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualA100CountLimit(BaseModel): + """Virtual A100 GPU card count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualA100CountUsage(BaseModel): + """Virtual A100 GPU card count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualH100CountLimit(BaseModel): + """Virtual H100 GPU card count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualH100CountUsage(BaseModel): + """Virtual H100 GPU card count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualH200CountLimit(BaseModel): + """Virtual H200 GPU card count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualH200CountUsage(BaseModel): + """Virtual H200 GPU card count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualL40sCountLimit(BaseModel): + """Virtual L40S GPU card count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualL40sCountUsage(BaseModel): + """Virtual L40S GPU card count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaImageCountLimit(BaseModel): + """Images Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaImageCountUsage(BaseModel): + """Images Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaImageSizeLimit(BaseModel): + """Images Size, bytes limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaImageSizeUsage(BaseModel): + """Images Size, bytes usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaIpuCountLimit(BaseModel): + """IPU Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaIpuCountUsage(BaseModel): + """IPU Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaLaasTopicCountLimit(BaseModel): + """LaaS Topics Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaLaasTopicCountUsage(BaseModel): + """LaaS Topics Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaLoadbalancerCountLimit(BaseModel): + """Load Balancers Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaLoadbalancerCountUsage(BaseModel): + """Load Balancers Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaNetworkCountLimit(BaseModel): + """Networks Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaNetworkCountUsage(BaseModel): + """Networks Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRamLimit(BaseModel): + """RAM Size, MiB limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRamUsage(BaseModel): + """RAM Size, MiB usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRegistryCountLimit(BaseModel): + """Registries count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRegistryCountUsage(BaseModel): + """Registries count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRegistryStorageLimit(BaseModel): + """Registries volume usage, GiB limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRegistryStorageUsage(BaseModel): + """Registries volume usage, GiB usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRouterCountLimit(BaseModel): + """Routers Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRouterCountUsage(BaseModel): + """Routers Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSecretCountLimit(BaseModel): + """Secret Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSecretCountUsage(BaseModel): + """Secret Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaServergroupCountLimit(BaseModel): + """Placement Group Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaServergroupCountUsage(BaseModel): + """Placement Group Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSfsCountLimit(BaseModel): + """Shared file system Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSfsCountUsage(BaseModel): + """Shared file system Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSfsSizeLimit(BaseModel): + """Shared file system Size, GiB limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSfsSizeUsage(BaseModel): + """Shared file system Size, GiB usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSharedVmCountLimit(BaseModel): + """Basic VMs Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSharedVmCountUsage(BaseModel): + """Basic VMs Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSnapshotScheduleCountLimit(BaseModel): + """Snapshot Schedules Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSnapshotScheduleCountUsage(BaseModel): + """Snapshot Schedules Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSubnetCountLimit(BaseModel): + """Subnets Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSubnetCountUsage(BaseModel): + """Subnets Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVmCountLimit(BaseModel): + """Instances Dedicated Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVmCountUsage(BaseModel): + """Instances Dedicated Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeCountLimit(BaseModel): + """Volumes Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeCountUsage(BaseModel): + """Volumes Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSizeLimit(BaseModel): + """Volumes Size, GiB limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSizeUsage(BaseModel): + """Volumes Size, GiB usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSnapshotsCountLimit(BaseModel): + """Snapshots Count limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSnapshotsCountUsage(BaseModel): + """Snapshots Count usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSnapshotsSizeLimit(BaseModel): + """Snapshots Size, GiB limit""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSnapshotsSizeUsage(BaseModel): + """Snapshots Size, GiB usage""" + + limit: int + """Сurrent quota limit""" + + usage: int + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuota(BaseModel): + region_id: int + """Region id""" + + region_name: str + """Region name""" + + baremetal_basic_count_limit: Optional[LastMessageRegionalQuotaBaremetalBasicCountLimit] = None + """Basic bare metal servers count limit""" + + baremetal_basic_count_usage: Optional[LastMessageRegionalQuotaBaremetalBasicCountUsage] = None + """Basic bare metal servers count usage""" + + baremetal_gpu_a100_count_limit: Optional[LastMessageRegionalQuotaBaremetalGPUA100CountLimit] = None + """Bare metal A100 GPU server count limit""" + + baremetal_gpu_a100_count_usage: Optional[LastMessageRegionalQuotaBaremetalGPUA100CountUsage] = None + """Bare metal A100 GPU server count usage""" + + baremetal_gpu_h100_count_limit: Optional[LastMessageRegionalQuotaBaremetalGPUH100CountLimit] = None + """Bare metal H100 GPU server count limit""" + + baremetal_gpu_h100_count_usage: Optional[LastMessageRegionalQuotaBaremetalGPUH100CountUsage] = None + """Bare metal H100 GPU server count usage""" + + baremetal_gpu_h200_count_limit: Optional[LastMessageRegionalQuotaBaremetalGPUH200CountLimit] = None + """Bare metal H200 GPU server count limit""" + + baremetal_gpu_h200_count_usage: Optional[LastMessageRegionalQuotaBaremetalGPUH200CountUsage] = None + """Bare metal H200 GPU server count usage""" + + baremetal_gpu_l40s_count_limit: Optional[LastMessageRegionalQuotaBaremetalGPUL40sCountLimit] = None + """Bare metal L40S GPU server count limit""" + + baremetal_gpu_l40s_count_usage: Optional[LastMessageRegionalQuotaBaremetalGPUL40sCountUsage] = None + """Bare metal L40S GPU server count usage""" + + baremetal_hf_count_limit: Optional[LastMessageRegionalQuotaBaremetalHfCountLimit] = None + """High-frequency bare metal servers count limit""" + + baremetal_hf_count_usage: Optional[LastMessageRegionalQuotaBaremetalHfCountUsage] = None + """High-frequency bare metal servers count usage""" + + baremetal_infrastructure_count_limit: Optional[LastMessageRegionalQuotaBaremetalInfrastructureCountLimit] = None + """Infrastructure bare metal servers count limit""" + + baremetal_infrastructure_count_usage: Optional[LastMessageRegionalQuotaBaremetalInfrastructureCountUsage] = None + """Infrastructure bare metal servers count usage""" + + baremetal_network_count_limit: Optional[LastMessageRegionalQuotaBaremetalNetworkCountLimit] = None + """Bare metal Network Count limit""" + + baremetal_network_count_usage: Optional[LastMessageRegionalQuotaBaremetalNetworkCountUsage] = None + """Bare metal Network Count usage""" + + baremetal_storage_count_limit: Optional[LastMessageRegionalQuotaBaremetalStorageCountLimit] = None + """Storage bare metal servers count limit""" + + baremetal_storage_count_usage: Optional[LastMessageRegionalQuotaBaremetalStorageCountUsage] = None + """Storage bare metal servers count usage""" + + caas_container_count_limit: Optional[LastMessageRegionalQuotaCaasContainerCountLimit] = None + """Containers count limit""" + + caas_container_count_usage: Optional[LastMessageRegionalQuotaCaasContainerCountUsage] = None + """Containers count usage""" + + caas_cpu_count_limit: Optional[LastMessageRegionalQuotaCaasCPUCountLimit] = None + """mCPU count for containers limit""" + + caas_cpu_count_usage: Optional[LastMessageRegionalQuotaCaasCPUCountUsage] = None + """mCPU count for containers usage""" + + caas_gpu_count_limit: Optional[LastMessageRegionalQuotaCaasGPUCountLimit] = None + """Containers gpu count limit""" + + caas_gpu_count_usage: Optional[LastMessageRegionalQuotaCaasGPUCountUsage] = None + """Containers gpu count usage""" + + caas_ram_size_limit: Optional[LastMessageRegionalQuotaCaasRamSizeLimit] = None + """MiB memory count for containers limit""" + + caas_ram_size_usage: Optional[LastMessageRegionalQuotaCaasRamSizeUsage] = None + """MiB memory count for containers usage""" + + cluster_count_limit: Optional[LastMessageRegionalQuotaClusterCountLimit] = None + """K8s clusters count limit""" + + cluster_count_usage: Optional[LastMessageRegionalQuotaClusterCountUsage] = None + """K8s clusters count usage""" + + cpu_count_limit: Optional[LastMessageRegionalQuotaCPUCountLimit] = None + """vCPU Count limit""" + + cpu_count_usage: Optional[LastMessageRegionalQuotaCPUCountUsage] = None + """vCPU Count usage""" + + dbaas_postgres_cluster_count_limit: Optional[LastMessageRegionalQuotaDbaasPostgresClusterCountLimit] = None + """DBaaS cluster count limit""" + + dbaas_postgres_cluster_count_usage: Optional[LastMessageRegionalQuotaDbaasPostgresClusterCountUsage] = None + """DBaaS cluster count usage""" + + external_ip_count_limit: Optional[LastMessageRegionalQuotaExternalIPCountLimit] = None + """External IP Count limit""" + + external_ip_count_usage: Optional[LastMessageRegionalQuotaExternalIPCountUsage] = None + """External IP Count usage""" + + faas_cpu_count_limit: Optional[LastMessageRegionalQuotaFaasCPUCountLimit] = None + """mCPU count for functions limit""" + + faas_cpu_count_usage: Optional[LastMessageRegionalQuotaFaasCPUCountUsage] = None + """mCPU count for functions usage""" + + faas_function_count_limit: Optional[LastMessageRegionalQuotaFaasFunctionCountLimit] = None + """Functions count limit""" + + faas_function_count_usage: Optional[LastMessageRegionalQuotaFaasFunctionCountUsage] = None + """Functions count usage""" + + faas_namespace_count_limit: Optional[LastMessageRegionalQuotaFaasNamespaceCountLimit] = None + """Functions namespace count limit""" + + faas_namespace_count_usage: Optional[LastMessageRegionalQuotaFaasNamespaceCountUsage] = None + """Functions namespace count usage""" + + faas_ram_size_limit: Optional[LastMessageRegionalQuotaFaasRamSizeLimit] = None + """MiB memory count for functions limit""" + + faas_ram_size_usage: Optional[LastMessageRegionalQuotaFaasRamSizeUsage] = None + """MiB memory count for functions usage""" + + firewall_count_limit: Optional[LastMessageRegionalQuotaFirewallCountLimit] = None + """Firewalls Count limit""" + + firewall_count_usage: Optional[LastMessageRegionalQuotaFirewallCountUsage] = None + """Firewalls Count usage""" + + floating_count_limit: Optional[LastMessageRegionalQuotaFloatingCountLimit] = None + """Floating IP Count limit""" + + floating_count_usage: Optional[LastMessageRegionalQuotaFloatingCountUsage] = None + """Floating IP Count usage""" + + gpu_count_limit: Optional[LastMessageRegionalQuotaGPUCountLimit] = None + """GPU Count limit""" + + gpu_count_usage: Optional[LastMessageRegionalQuotaGPUCountUsage] = None + """GPU Count usage""" + + gpu_virtual_a100_count_limit: Optional[LastMessageRegionalQuotaGPUVirtualA100CountLimit] = None + """Virtual A100 GPU card count limit""" + + gpu_virtual_a100_count_usage: Optional[LastMessageRegionalQuotaGPUVirtualA100CountUsage] = None + """Virtual A100 GPU card count usage""" + + gpu_virtual_h100_count_limit: Optional[LastMessageRegionalQuotaGPUVirtualH100CountLimit] = None + """Virtual H100 GPU card count limit""" + + gpu_virtual_h100_count_usage: Optional[LastMessageRegionalQuotaGPUVirtualH100CountUsage] = None + """Virtual H100 GPU card count usage""" + + gpu_virtual_h200_count_limit: Optional[LastMessageRegionalQuotaGPUVirtualH200CountLimit] = None + """Virtual H200 GPU card count limit""" + + gpu_virtual_h200_count_usage: Optional[LastMessageRegionalQuotaGPUVirtualH200CountUsage] = None + """Virtual H200 GPU card count usage""" + + gpu_virtual_l40s_count_limit: Optional[LastMessageRegionalQuotaGPUVirtualL40sCountLimit] = None + """Virtual L40S GPU card count limit""" + + gpu_virtual_l40s_count_usage: Optional[LastMessageRegionalQuotaGPUVirtualL40sCountUsage] = None + """Virtual L40S GPU card count usage""" + + image_count_limit: Optional[LastMessageRegionalQuotaImageCountLimit] = None + """Images Count limit""" + + image_count_usage: Optional[LastMessageRegionalQuotaImageCountUsage] = None + """Images Count usage""" + + image_size_limit: Optional[LastMessageRegionalQuotaImageSizeLimit] = None + """Images Size, bytes limit""" + + image_size_usage: Optional[LastMessageRegionalQuotaImageSizeUsage] = None + """Images Size, bytes usage""" + + ipu_count_limit: Optional[LastMessageRegionalQuotaIpuCountLimit] = None + """IPU Count limit""" + + ipu_count_usage: Optional[LastMessageRegionalQuotaIpuCountUsage] = None + """IPU Count usage""" + + laas_topic_count_limit: Optional[LastMessageRegionalQuotaLaasTopicCountLimit] = None + """LaaS Topics Count limit""" + + laas_topic_count_usage: Optional[LastMessageRegionalQuotaLaasTopicCountUsage] = None + """LaaS Topics Count usage""" + + loadbalancer_count_limit: Optional[LastMessageRegionalQuotaLoadbalancerCountLimit] = None + """Load Balancers Count limit""" + + loadbalancer_count_usage: Optional[LastMessageRegionalQuotaLoadbalancerCountUsage] = None + """Load Balancers Count usage""" + + network_count_limit: Optional[LastMessageRegionalQuotaNetworkCountLimit] = None + """Networks Count limit""" + + network_count_usage: Optional[LastMessageRegionalQuotaNetworkCountUsage] = None + """Networks Count usage""" + + ram_limit: Optional[LastMessageRegionalQuotaRamLimit] = None + """RAM Size, MiB limit""" + + ram_usage: Optional[LastMessageRegionalQuotaRamUsage] = None + """RAM Size, MiB usage""" + + registry_count_limit: Optional[LastMessageRegionalQuotaRegistryCountLimit] = None + """Registries count limit""" + + registry_count_usage: Optional[LastMessageRegionalQuotaRegistryCountUsage] = None + """Registries count usage""" + + registry_storage_limit: Optional[LastMessageRegionalQuotaRegistryStorageLimit] = None + """Registries volume usage, GiB limit""" + + registry_storage_usage: Optional[LastMessageRegionalQuotaRegistryStorageUsage] = None + """Registries volume usage, GiB usage""" + + router_count_limit: Optional[LastMessageRegionalQuotaRouterCountLimit] = None + """Routers Count limit""" + + router_count_usage: Optional[LastMessageRegionalQuotaRouterCountUsage] = None + """Routers Count usage""" + + secret_count_limit: Optional[LastMessageRegionalQuotaSecretCountLimit] = None + """Secret Count limit""" + + secret_count_usage: Optional[LastMessageRegionalQuotaSecretCountUsage] = None + """Secret Count usage""" + + servergroup_count_limit: Optional[LastMessageRegionalQuotaServergroupCountLimit] = None + """Placement Group Count limit""" + + servergroup_count_usage: Optional[LastMessageRegionalQuotaServergroupCountUsage] = None + """Placement Group Count usage""" + + sfs_count_limit: Optional[LastMessageRegionalQuotaSfsCountLimit] = None + """Shared file system Count limit""" + + sfs_count_usage: Optional[LastMessageRegionalQuotaSfsCountUsage] = None + """Shared file system Count usage""" + + sfs_size_limit: Optional[LastMessageRegionalQuotaSfsSizeLimit] = None + """Shared file system Size, GiB limit""" + + sfs_size_usage: Optional[LastMessageRegionalQuotaSfsSizeUsage] = None + """Shared file system Size, GiB usage""" + + shared_vm_count_limit: Optional[LastMessageRegionalQuotaSharedVmCountLimit] = None + """Basic VMs Count limit""" + + shared_vm_count_usage: Optional[LastMessageRegionalQuotaSharedVmCountUsage] = None + """Basic VMs Count usage""" + + snapshot_schedule_count_limit: Optional[LastMessageRegionalQuotaSnapshotScheduleCountLimit] = None + """Snapshot Schedules Count limit""" + + snapshot_schedule_count_usage: Optional[LastMessageRegionalQuotaSnapshotScheduleCountUsage] = None + """Snapshot Schedules Count usage""" + + subnet_count_limit: Optional[LastMessageRegionalQuotaSubnetCountLimit] = None + """Subnets Count limit""" + + subnet_count_usage: Optional[LastMessageRegionalQuotaSubnetCountUsage] = None + """Subnets Count usage""" + + vm_count_limit: Optional[LastMessageRegionalQuotaVmCountLimit] = None + """Instances Dedicated Count limit""" + + vm_count_usage: Optional[LastMessageRegionalQuotaVmCountUsage] = None + """Instances Dedicated Count usage""" + + volume_count_limit: Optional[LastMessageRegionalQuotaVolumeCountLimit] = None + """Volumes Count limit""" + + volume_count_usage: Optional[LastMessageRegionalQuotaVolumeCountUsage] = None + """Volumes Count usage""" + + volume_size_limit: Optional[LastMessageRegionalQuotaVolumeSizeLimit] = None + """Volumes Size, GiB limit""" + + volume_size_usage: Optional[LastMessageRegionalQuotaVolumeSizeUsage] = None + """Volumes Size, GiB usage""" + + volume_snapshots_count_limit: Optional[LastMessageRegionalQuotaVolumeSnapshotsCountLimit] = None + """Snapshots Count limit""" + + volume_snapshots_count_usage: Optional[LastMessageRegionalQuotaVolumeSnapshotsCountUsage] = None + """Snapshots Count usage""" + + volume_snapshots_size_limit: Optional[LastMessageRegionalQuotaVolumeSnapshotsSizeLimit] = None + """Snapshots Size, GiB limit""" + + volume_snapshots_size_usage: Optional[LastMessageRegionalQuotaVolumeSnapshotsSizeUsage] = None + """Snapshots Size, GiB usage""" + + +class LastMessage(BaseModel): + """A message data""" + + global_quotas: LastMessageGlobalQuotas + """Global quota that exceed the threshold""" + + regional_quotas: List[LastMessageRegionalQuota] + """Regional quota that exceed the threshold""" + + +class NotificationThreshold(BaseModel): + client_id: int + """Client id""" + + last_message: Optional[LastMessage] = None + """A message data""" + + last_sending: Optional[datetime] = None + """Time of last successful email sending""" + + threshold: int + """Quota notification threshold in percentage""" diff --git a/src/gcore/types/cloud/quotas/notification_threshold_update_params.py b/src/gcore/types/cloud/quotas/notification_threshold_update_params.py new file mode 100644 index 00000000..fa8e7468 --- /dev/null +++ b/src/gcore/types/cloud/quotas/notification_threshold_update_params.py @@ -0,0 +1,1645 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Union, Iterable, Optional +from datetime import datetime +from typing_extensions import Required, Annotated, TypedDict + +from ...._utils import PropertyInfo + +__all__ = [ + "NotificationThresholdUpdateParams", + "LastMessage", + "LastMessageGlobalQuotas", + "LastMessageGlobalQuotasInferenceCPUMillicoreCountLimit", + "LastMessageGlobalQuotasInferenceCPUMillicoreCountUsage", + "LastMessageGlobalQuotasInferenceGPUA100CountLimit", + "LastMessageGlobalQuotasInferenceGPUA100CountUsage", + "LastMessageGlobalQuotasInferenceGPUH100CountLimit", + "LastMessageGlobalQuotasInferenceGPUH100CountUsage", + "LastMessageGlobalQuotasInferenceGPUL40sCountLimit", + "LastMessageGlobalQuotasInferenceGPUL40sCountUsage", + "LastMessageGlobalQuotasInferenceInstanceCountLimit", + "LastMessageGlobalQuotasInferenceInstanceCountUsage", + "LastMessageGlobalQuotasKeypairCountLimit", + "LastMessageGlobalQuotasKeypairCountUsage", + "LastMessageGlobalQuotasProjectCountLimit", + "LastMessageGlobalQuotasProjectCountUsage", + "LastMessageRegionalQuota", + "LastMessageRegionalQuotaBaremetalBasicCountLimit", + "LastMessageRegionalQuotaBaremetalBasicCountUsage", + "LastMessageRegionalQuotaBaremetalGPUA100CountLimit", + "LastMessageRegionalQuotaBaremetalGPUA100CountUsage", + "LastMessageRegionalQuotaBaremetalGPUH100CountLimit", + "LastMessageRegionalQuotaBaremetalGPUH100CountUsage", + "LastMessageRegionalQuotaBaremetalGPUH200CountLimit", + "LastMessageRegionalQuotaBaremetalGPUH200CountUsage", + "LastMessageRegionalQuotaBaremetalGPUL40sCountLimit", + "LastMessageRegionalQuotaBaremetalGPUL40sCountUsage", + "LastMessageRegionalQuotaBaremetalHfCountLimit", + "LastMessageRegionalQuotaBaremetalHfCountUsage", + "LastMessageRegionalQuotaBaremetalInfrastructureCountLimit", + "LastMessageRegionalQuotaBaremetalInfrastructureCountUsage", + "LastMessageRegionalQuotaBaremetalNetworkCountLimit", + "LastMessageRegionalQuotaBaremetalNetworkCountUsage", + "LastMessageRegionalQuotaBaremetalStorageCountLimit", + "LastMessageRegionalQuotaBaremetalStorageCountUsage", + "LastMessageRegionalQuotaCaasContainerCountLimit", + "LastMessageRegionalQuotaCaasContainerCountUsage", + "LastMessageRegionalQuotaCaasCPUCountLimit", + "LastMessageRegionalQuotaCaasCPUCountUsage", + "LastMessageRegionalQuotaCaasGPUCountLimit", + "LastMessageRegionalQuotaCaasGPUCountUsage", + "LastMessageRegionalQuotaCaasRamSizeLimit", + "LastMessageRegionalQuotaCaasRamSizeUsage", + "LastMessageRegionalQuotaClusterCountLimit", + "LastMessageRegionalQuotaClusterCountUsage", + "LastMessageRegionalQuotaCPUCountLimit", + "LastMessageRegionalQuotaCPUCountUsage", + "LastMessageRegionalQuotaDbaasPostgresClusterCountLimit", + "LastMessageRegionalQuotaDbaasPostgresClusterCountUsage", + "LastMessageRegionalQuotaExternalIPCountLimit", + "LastMessageRegionalQuotaExternalIPCountUsage", + "LastMessageRegionalQuotaFaasCPUCountLimit", + "LastMessageRegionalQuotaFaasCPUCountUsage", + "LastMessageRegionalQuotaFaasFunctionCountLimit", + "LastMessageRegionalQuotaFaasFunctionCountUsage", + "LastMessageRegionalQuotaFaasNamespaceCountLimit", + "LastMessageRegionalQuotaFaasNamespaceCountUsage", + "LastMessageRegionalQuotaFaasRamSizeLimit", + "LastMessageRegionalQuotaFaasRamSizeUsage", + "LastMessageRegionalQuotaFirewallCountLimit", + "LastMessageRegionalQuotaFirewallCountUsage", + "LastMessageRegionalQuotaFloatingCountLimit", + "LastMessageRegionalQuotaFloatingCountUsage", + "LastMessageRegionalQuotaGPUCountLimit", + "LastMessageRegionalQuotaGPUCountUsage", + "LastMessageRegionalQuotaGPUVirtualA100CountLimit", + "LastMessageRegionalQuotaGPUVirtualA100CountUsage", + "LastMessageRegionalQuotaGPUVirtualH100CountLimit", + "LastMessageRegionalQuotaGPUVirtualH100CountUsage", + "LastMessageRegionalQuotaGPUVirtualH200CountLimit", + "LastMessageRegionalQuotaGPUVirtualH200CountUsage", + "LastMessageRegionalQuotaGPUVirtualL40sCountLimit", + "LastMessageRegionalQuotaGPUVirtualL40sCountUsage", + "LastMessageRegionalQuotaImageCountLimit", + "LastMessageRegionalQuotaImageCountUsage", + "LastMessageRegionalQuotaImageSizeLimit", + "LastMessageRegionalQuotaImageSizeUsage", + "LastMessageRegionalQuotaIpuCountLimit", + "LastMessageRegionalQuotaIpuCountUsage", + "LastMessageRegionalQuotaLaasTopicCountLimit", + "LastMessageRegionalQuotaLaasTopicCountUsage", + "LastMessageRegionalQuotaLoadbalancerCountLimit", + "LastMessageRegionalQuotaLoadbalancerCountUsage", + "LastMessageRegionalQuotaNetworkCountLimit", + "LastMessageRegionalQuotaNetworkCountUsage", + "LastMessageRegionalQuotaRamLimit", + "LastMessageRegionalQuotaRamUsage", + "LastMessageRegionalQuotaRegistryCountLimit", + "LastMessageRegionalQuotaRegistryCountUsage", + "LastMessageRegionalQuotaRegistryStorageLimit", + "LastMessageRegionalQuotaRegistryStorageUsage", + "LastMessageRegionalQuotaRouterCountLimit", + "LastMessageRegionalQuotaRouterCountUsage", + "LastMessageRegionalQuotaSecretCountLimit", + "LastMessageRegionalQuotaSecretCountUsage", + "LastMessageRegionalQuotaServergroupCountLimit", + "LastMessageRegionalQuotaServergroupCountUsage", + "LastMessageRegionalQuotaSfsCountLimit", + "LastMessageRegionalQuotaSfsCountUsage", + "LastMessageRegionalQuotaSfsSizeLimit", + "LastMessageRegionalQuotaSfsSizeUsage", + "LastMessageRegionalQuotaSharedVmCountLimit", + "LastMessageRegionalQuotaSharedVmCountUsage", + "LastMessageRegionalQuotaSnapshotScheduleCountLimit", + "LastMessageRegionalQuotaSnapshotScheduleCountUsage", + "LastMessageRegionalQuotaSubnetCountLimit", + "LastMessageRegionalQuotaSubnetCountUsage", + "LastMessageRegionalQuotaVmCountLimit", + "LastMessageRegionalQuotaVmCountUsage", + "LastMessageRegionalQuotaVolumeCountLimit", + "LastMessageRegionalQuotaVolumeCountUsage", + "LastMessageRegionalQuotaVolumeSizeLimit", + "LastMessageRegionalQuotaVolumeSizeUsage", + "LastMessageRegionalQuotaVolumeSnapshotsCountLimit", + "LastMessageRegionalQuotaVolumeSnapshotsCountUsage", + "LastMessageRegionalQuotaVolumeSnapshotsSizeLimit", + "LastMessageRegionalQuotaVolumeSnapshotsSizeUsage", +] + + +class NotificationThresholdUpdateParams(TypedDict, total=False): + threshold: Required[int] + """Quota notification threshold in percentage""" + + last_message: Optional[LastMessage] + """A message data""" + + last_sending: Annotated[Union[str, datetime, None], PropertyInfo(format="iso8601")] + """Time of last successful email sending""" + + +class LastMessageGlobalQuotasInferenceCPUMillicoreCountLimit(TypedDict, total=False): + """Inference CPU millicore count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceCPUMillicoreCountUsage(TypedDict, total=False): + """Inference CPU millicore count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUA100CountLimit(TypedDict, total=False): + """Inference GPU A100 Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUA100CountUsage(TypedDict, total=False): + """Inference GPU A100 Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUH100CountLimit(TypedDict, total=False): + """Inference GPU H100 Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUH100CountUsage(TypedDict, total=False): + """Inference GPU H100 Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUL40sCountLimit(TypedDict, total=False): + """Inference GPU L40s Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceGPUL40sCountUsage(TypedDict, total=False): + """Inference GPU L40s Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceInstanceCountLimit(TypedDict, total=False): + """Inference instance count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasInferenceInstanceCountUsage(TypedDict, total=False): + """Inference instance count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasKeypairCountLimit(TypedDict, total=False): + """SSH Keys Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasKeypairCountUsage(TypedDict, total=False): + """SSH Keys Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasProjectCountLimit(TypedDict, total=False): + """Projects Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotasProjectCountUsage(TypedDict, total=False): + """Projects Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageGlobalQuotas(TypedDict, total=False): + """Global quota that exceed the threshold""" + + inference_cpu_millicore_count_limit: LastMessageGlobalQuotasInferenceCPUMillicoreCountLimit + """Inference CPU millicore count limit""" + + inference_cpu_millicore_count_usage: LastMessageGlobalQuotasInferenceCPUMillicoreCountUsage + """Inference CPU millicore count usage""" + + inference_gpu_a100_count_limit: LastMessageGlobalQuotasInferenceGPUA100CountLimit + """Inference GPU A100 Count limit""" + + inference_gpu_a100_count_usage: LastMessageGlobalQuotasInferenceGPUA100CountUsage + """Inference GPU A100 Count usage""" + + inference_gpu_h100_count_limit: LastMessageGlobalQuotasInferenceGPUH100CountLimit + """Inference GPU H100 Count limit""" + + inference_gpu_h100_count_usage: LastMessageGlobalQuotasInferenceGPUH100CountUsage + """Inference GPU H100 Count usage""" + + inference_gpu_l40s_count_limit: LastMessageGlobalQuotasInferenceGPUL40sCountLimit + """Inference GPU L40s Count limit""" + + inference_gpu_l40s_count_usage: LastMessageGlobalQuotasInferenceGPUL40sCountUsage + """Inference GPU L40s Count usage""" + + inference_instance_count_limit: LastMessageGlobalQuotasInferenceInstanceCountLimit + """Inference instance count limit""" + + inference_instance_count_usage: LastMessageGlobalQuotasInferenceInstanceCountUsage + """Inference instance count usage""" + + keypair_count_limit: LastMessageGlobalQuotasKeypairCountLimit + """SSH Keys Count limit""" + + keypair_count_usage: LastMessageGlobalQuotasKeypairCountUsage + """SSH Keys Count usage""" + + project_count_limit: LastMessageGlobalQuotasProjectCountLimit + """Projects Count limit""" + + project_count_usage: LastMessageGlobalQuotasProjectCountUsage + """Projects Count usage""" + + +class LastMessageRegionalQuotaBaremetalBasicCountLimit(TypedDict, total=False): + """Basic bare metal servers count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalBasicCountUsage(TypedDict, total=False): + """Basic bare metal servers count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUA100CountLimit(TypedDict, total=False): + """Bare metal A100 GPU server count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUA100CountUsage(TypedDict, total=False): + """Bare metal A100 GPU server count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUH100CountLimit(TypedDict, total=False): + """Bare metal H100 GPU server count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUH100CountUsage(TypedDict, total=False): + """Bare metal H100 GPU server count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUH200CountLimit(TypedDict, total=False): + """Bare metal H200 GPU server count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUH200CountUsage(TypedDict, total=False): + """Bare metal H200 GPU server count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUL40sCountLimit(TypedDict, total=False): + """Bare metal L40S GPU server count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalGPUL40sCountUsage(TypedDict, total=False): + """Bare metal L40S GPU server count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalHfCountLimit(TypedDict, total=False): + """High-frequency bare metal servers count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalHfCountUsage(TypedDict, total=False): + """High-frequency bare metal servers count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalInfrastructureCountLimit(TypedDict, total=False): + """Infrastructure bare metal servers count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalInfrastructureCountUsage(TypedDict, total=False): + """Infrastructure bare metal servers count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalNetworkCountLimit(TypedDict, total=False): + """Bare metal Network Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalNetworkCountUsage(TypedDict, total=False): + """Bare metal Network Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalStorageCountLimit(TypedDict, total=False): + """Storage bare metal servers count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaBaremetalStorageCountUsage(TypedDict, total=False): + """Storage bare metal servers count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasContainerCountLimit(TypedDict, total=False): + """Containers count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasContainerCountUsage(TypedDict, total=False): + """Containers count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasCPUCountLimit(TypedDict, total=False): + """mCPU count for containers limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasCPUCountUsage(TypedDict, total=False): + """mCPU count for containers usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasGPUCountLimit(TypedDict, total=False): + """Containers gpu count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasGPUCountUsage(TypedDict, total=False): + """Containers gpu count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasRamSizeLimit(TypedDict, total=False): + """MiB memory count for containers limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCaasRamSizeUsage(TypedDict, total=False): + """MiB memory count for containers usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaClusterCountLimit(TypedDict, total=False): + """K8s clusters count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaClusterCountUsage(TypedDict, total=False): + """K8s clusters count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCPUCountLimit(TypedDict, total=False): + """vCPU Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaCPUCountUsage(TypedDict, total=False): + """vCPU Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaDbaasPostgresClusterCountLimit(TypedDict, total=False): + """DBaaS cluster count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaDbaasPostgresClusterCountUsage(TypedDict, total=False): + """DBaaS cluster count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaExternalIPCountLimit(TypedDict, total=False): + """External IP Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaExternalIPCountUsage(TypedDict, total=False): + """External IP Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasCPUCountLimit(TypedDict, total=False): + """mCPU count for functions limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasCPUCountUsage(TypedDict, total=False): + """mCPU count for functions usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasFunctionCountLimit(TypedDict, total=False): + """Functions count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasFunctionCountUsage(TypedDict, total=False): + """Functions count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasNamespaceCountLimit(TypedDict, total=False): + """Functions namespace count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasNamespaceCountUsage(TypedDict, total=False): + """Functions namespace count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasRamSizeLimit(TypedDict, total=False): + """MiB memory count for functions limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFaasRamSizeUsage(TypedDict, total=False): + """MiB memory count for functions usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFirewallCountLimit(TypedDict, total=False): + """Firewalls Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFirewallCountUsage(TypedDict, total=False): + """Firewalls Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFloatingCountLimit(TypedDict, total=False): + """Floating IP Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaFloatingCountUsage(TypedDict, total=False): + """Floating IP Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUCountLimit(TypedDict, total=False): + """GPU Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUCountUsage(TypedDict, total=False): + """GPU Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualA100CountLimit(TypedDict, total=False): + """Virtual A100 GPU card count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualA100CountUsage(TypedDict, total=False): + """Virtual A100 GPU card count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualH100CountLimit(TypedDict, total=False): + """Virtual H100 GPU card count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualH100CountUsage(TypedDict, total=False): + """Virtual H100 GPU card count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualH200CountLimit(TypedDict, total=False): + """Virtual H200 GPU card count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualH200CountUsage(TypedDict, total=False): + """Virtual H200 GPU card count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualL40sCountLimit(TypedDict, total=False): + """Virtual L40S GPU card count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaGPUVirtualL40sCountUsage(TypedDict, total=False): + """Virtual L40S GPU card count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaImageCountLimit(TypedDict, total=False): + """Images Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaImageCountUsage(TypedDict, total=False): + """Images Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaImageSizeLimit(TypedDict, total=False): + """Images Size, bytes limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaImageSizeUsage(TypedDict, total=False): + """Images Size, bytes usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaIpuCountLimit(TypedDict, total=False): + """IPU Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaIpuCountUsage(TypedDict, total=False): + """IPU Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaLaasTopicCountLimit(TypedDict, total=False): + """LaaS Topics Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaLaasTopicCountUsage(TypedDict, total=False): + """LaaS Topics Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaLoadbalancerCountLimit(TypedDict, total=False): + """Load Balancers Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaLoadbalancerCountUsage(TypedDict, total=False): + """Load Balancers Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaNetworkCountLimit(TypedDict, total=False): + """Networks Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaNetworkCountUsage(TypedDict, total=False): + """Networks Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRamLimit(TypedDict, total=False): + """RAM Size, MiB limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRamUsage(TypedDict, total=False): + """RAM Size, MiB usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRegistryCountLimit(TypedDict, total=False): + """Registries count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRegistryCountUsage(TypedDict, total=False): + """Registries count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRegistryStorageLimit(TypedDict, total=False): + """Registries volume usage, GiB limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRegistryStorageUsage(TypedDict, total=False): + """Registries volume usage, GiB usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRouterCountLimit(TypedDict, total=False): + """Routers Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaRouterCountUsage(TypedDict, total=False): + """Routers Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSecretCountLimit(TypedDict, total=False): + """Secret Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSecretCountUsage(TypedDict, total=False): + """Secret Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaServergroupCountLimit(TypedDict, total=False): + """Placement Group Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaServergroupCountUsage(TypedDict, total=False): + """Placement Group Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSfsCountLimit(TypedDict, total=False): + """Shared file system Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSfsCountUsage(TypedDict, total=False): + """Shared file system Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSfsSizeLimit(TypedDict, total=False): + """Shared file system Size, GiB limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSfsSizeUsage(TypedDict, total=False): + """Shared file system Size, GiB usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSharedVmCountLimit(TypedDict, total=False): + """Basic VMs Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSharedVmCountUsage(TypedDict, total=False): + """Basic VMs Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSnapshotScheduleCountLimit(TypedDict, total=False): + """Snapshot Schedules Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSnapshotScheduleCountUsage(TypedDict, total=False): + """Snapshot Schedules Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSubnetCountLimit(TypedDict, total=False): + """Subnets Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaSubnetCountUsage(TypedDict, total=False): + """Subnets Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVmCountLimit(TypedDict, total=False): + """Instances Dedicated Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVmCountUsage(TypedDict, total=False): + """Instances Dedicated Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeCountLimit(TypedDict, total=False): + """Volumes Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeCountUsage(TypedDict, total=False): + """Volumes Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSizeLimit(TypedDict, total=False): + """Volumes Size, GiB limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSizeUsage(TypedDict, total=False): + """Volumes Size, GiB usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSnapshotsCountLimit(TypedDict, total=False): + """Snapshots Count limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSnapshotsCountUsage(TypedDict, total=False): + """Snapshots Count usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSnapshotsSizeLimit(TypedDict, total=False): + """Snapshots Size, GiB limit""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuotaVolumeSnapshotsSizeUsage(TypedDict, total=False): + """Snapshots Size, GiB usage""" + + limit: Required[int] + """Сurrent quota limit""" + + usage: Required[int] + """Сurrent amount of resource used""" + + +class LastMessageRegionalQuota(TypedDict, total=False): + region_id: Required[int] + """Region id""" + + region_name: Required[str] + """Region name""" + + baremetal_basic_count_limit: LastMessageRegionalQuotaBaremetalBasicCountLimit + """Basic bare metal servers count limit""" + + baremetal_basic_count_usage: LastMessageRegionalQuotaBaremetalBasicCountUsage + """Basic bare metal servers count usage""" + + baremetal_gpu_a100_count_limit: LastMessageRegionalQuotaBaremetalGPUA100CountLimit + """Bare metal A100 GPU server count limit""" + + baremetal_gpu_a100_count_usage: LastMessageRegionalQuotaBaremetalGPUA100CountUsage + """Bare metal A100 GPU server count usage""" + + baremetal_gpu_h100_count_limit: LastMessageRegionalQuotaBaremetalGPUH100CountLimit + """Bare metal H100 GPU server count limit""" + + baremetal_gpu_h100_count_usage: LastMessageRegionalQuotaBaremetalGPUH100CountUsage + """Bare metal H100 GPU server count usage""" + + baremetal_gpu_h200_count_limit: LastMessageRegionalQuotaBaremetalGPUH200CountLimit + """Bare metal H200 GPU server count limit""" + + baremetal_gpu_h200_count_usage: LastMessageRegionalQuotaBaremetalGPUH200CountUsage + """Bare metal H200 GPU server count usage""" + + baremetal_gpu_l40s_count_limit: LastMessageRegionalQuotaBaremetalGPUL40sCountLimit + """Bare metal L40S GPU server count limit""" + + baremetal_gpu_l40s_count_usage: LastMessageRegionalQuotaBaremetalGPUL40sCountUsage + """Bare metal L40S GPU server count usage""" + + baremetal_hf_count_limit: LastMessageRegionalQuotaBaremetalHfCountLimit + """High-frequency bare metal servers count limit""" + + baremetal_hf_count_usage: LastMessageRegionalQuotaBaremetalHfCountUsage + """High-frequency bare metal servers count usage""" + + baremetal_infrastructure_count_limit: LastMessageRegionalQuotaBaremetalInfrastructureCountLimit + """Infrastructure bare metal servers count limit""" + + baremetal_infrastructure_count_usage: LastMessageRegionalQuotaBaremetalInfrastructureCountUsage + """Infrastructure bare metal servers count usage""" + + baremetal_network_count_limit: LastMessageRegionalQuotaBaremetalNetworkCountLimit + """Bare metal Network Count limit""" + + baremetal_network_count_usage: LastMessageRegionalQuotaBaremetalNetworkCountUsage + """Bare metal Network Count usage""" + + baremetal_storage_count_limit: LastMessageRegionalQuotaBaremetalStorageCountLimit + """Storage bare metal servers count limit""" + + baremetal_storage_count_usage: LastMessageRegionalQuotaBaremetalStorageCountUsage + """Storage bare metal servers count usage""" + + caas_container_count_limit: LastMessageRegionalQuotaCaasContainerCountLimit + """Containers count limit""" + + caas_container_count_usage: LastMessageRegionalQuotaCaasContainerCountUsage + """Containers count usage""" + + caas_cpu_count_limit: LastMessageRegionalQuotaCaasCPUCountLimit + """mCPU count for containers limit""" + + caas_cpu_count_usage: LastMessageRegionalQuotaCaasCPUCountUsage + """mCPU count for containers usage""" + + caas_gpu_count_limit: LastMessageRegionalQuotaCaasGPUCountLimit + """Containers gpu count limit""" + + caas_gpu_count_usage: LastMessageRegionalQuotaCaasGPUCountUsage + """Containers gpu count usage""" + + caas_ram_size_limit: LastMessageRegionalQuotaCaasRamSizeLimit + """MiB memory count for containers limit""" + + caas_ram_size_usage: LastMessageRegionalQuotaCaasRamSizeUsage + """MiB memory count for containers usage""" + + cluster_count_limit: LastMessageRegionalQuotaClusterCountLimit + """K8s clusters count limit""" + + cluster_count_usage: LastMessageRegionalQuotaClusterCountUsage + """K8s clusters count usage""" + + cpu_count_limit: LastMessageRegionalQuotaCPUCountLimit + """vCPU Count limit""" + + cpu_count_usage: LastMessageRegionalQuotaCPUCountUsage + """vCPU Count usage""" + + dbaas_postgres_cluster_count_limit: LastMessageRegionalQuotaDbaasPostgresClusterCountLimit + """DBaaS cluster count limit""" + + dbaas_postgres_cluster_count_usage: LastMessageRegionalQuotaDbaasPostgresClusterCountUsage + """DBaaS cluster count usage""" + + external_ip_count_limit: LastMessageRegionalQuotaExternalIPCountLimit + """External IP Count limit""" + + external_ip_count_usage: LastMessageRegionalQuotaExternalIPCountUsage + """External IP Count usage""" + + faas_cpu_count_limit: LastMessageRegionalQuotaFaasCPUCountLimit + """mCPU count for functions limit""" + + faas_cpu_count_usage: LastMessageRegionalQuotaFaasCPUCountUsage + """mCPU count for functions usage""" + + faas_function_count_limit: LastMessageRegionalQuotaFaasFunctionCountLimit + """Functions count limit""" + + faas_function_count_usage: LastMessageRegionalQuotaFaasFunctionCountUsage + """Functions count usage""" + + faas_namespace_count_limit: LastMessageRegionalQuotaFaasNamespaceCountLimit + """Functions namespace count limit""" + + faas_namespace_count_usage: LastMessageRegionalQuotaFaasNamespaceCountUsage + """Functions namespace count usage""" + + faas_ram_size_limit: LastMessageRegionalQuotaFaasRamSizeLimit + """MiB memory count for functions limit""" + + faas_ram_size_usage: LastMessageRegionalQuotaFaasRamSizeUsage + """MiB memory count for functions usage""" + + firewall_count_limit: LastMessageRegionalQuotaFirewallCountLimit + """Firewalls Count limit""" + + firewall_count_usage: LastMessageRegionalQuotaFirewallCountUsage + """Firewalls Count usage""" + + floating_count_limit: LastMessageRegionalQuotaFloatingCountLimit + """Floating IP Count limit""" + + floating_count_usage: LastMessageRegionalQuotaFloatingCountUsage + """Floating IP Count usage""" + + gpu_count_limit: LastMessageRegionalQuotaGPUCountLimit + """GPU Count limit""" + + gpu_count_usage: LastMessageRegionalQuotaGPUCountUsage + """GPU Count usage""" + + gpu_virtual_a100_count_limit: LastMessageRegionalQuotaGPUVirtualA100CountLimit + """Virtual A100 GPU card count limit""" + + gpu_virtual_a100_count_usage: LastMessageRegionalQuotaGPUVirtualA100CountUsage + """Virtual A100 GPU card count usage""" + + gpu_virtual_h100_count_limit: LastMessageRegionalQuotaGPUVirtualH100CountLimit + """Virtual H100 GPU card count limit""" + + gpu_virtual_h100_count_usage: LastMessageRegionalQuotaGPUVirtualH100CountUsage + """Virtual H100 GPU card count usage""" + + gpu_virtual_h200_count_limit: LastMessageRegionalQuotaGPUVirtualH200CountLimit + """Virtual H200 GPU card count limit""" + + gpu_virtual_h200_count_usage: LastMessageRegionalQuotaGPUVirtualH200CountUsage + """Virtual H200 GPU card count usage""" + + gpu_virtual_l40s_count_limit: LastMessageRegionalQuotaGPUVirtualL40sCountLimit + """Virtual L40S GPU card count limit""" + + gpu_virtual_l40s_count_usage: LastMessageRegionalQuotaGPUVirtualL40sCountUsage + """Virtual L40S GPU card count usage""" + + image_count_limit: LastMessageRegionalQuotaImageCountLimit + """Images Count limit""" + + image_count_usage: LastMessageRegionalQuotaImageCountUsage + """Images Count usage""" + + image_size_limit: LastMessageRegionalQuotaImageSizeLimit + """Images Size, bytes limit""" + + image_size_usage: LastMessageRegionalQuotaImageSizeUsage + """Images Size, bytes usage""" + + ipu_count_limit: LastMessageRegionalQuotaIpuCountLimit + """IPU Count limit""" + + ipu_count_usage: LastMessageRegionalQuotaIpuCountUsage + """IPU Count usage""" + + laas_topic_count_limit: LastMessageRegionalQuotaLaasTopicCountLimit + """LaaS Topics Count limit""" + + laas_topic_count_usage: LastMessageRegionalQuotaLaasTopicCountUsage + """LaaS Topics Count usage""" + + loadbalancer_count_limit: LastMessageRegionalQuotaLoadbalancerCountLimit + """Load Balancers Count limit""" + + loadbalancer_count_usage: LastMessageRegionalQuotaLoadbalancerCountUsage + """Load Balancers Count usage""" + + network_count_limit: LastMessageRegionalQuotaNetworkCountLimit + """Networks Count limit""" + + network_count_usage: LastMessageRegionalQuotaNetworkCountUsage + """Networks Count usage""" + + ram_limit: LastMessageRegionalQuotaRamLimit + """RAM Size, MiB limit""" + + ram_usage: LastMessageRegionalQuotaRamUsage + """RAM Size, MiB usage""" + + registry_count_limit: LastMessageRegionalQuotaRegistryCountLimit + """Registries count limit""" + + registry_count_usage: LastMessageRegionalQuotaRegistryCountUsage + """Registries count usage""" + + registry_storage_limit: LastMessageRegionalQuotaRegistryStorageLimit + """Registries volume usage, GiB limit""" + + registry_storage_usage: LastMessageRegionalQuotaRegistryStorageUsage + """Registries volume usage, GiB usage""" + + router_count_limit: LastMessageRegionalQuotaRouterCountLimit + """Routers Count limit""" + + router_count_usage: LastMessageRegionalQuotaRouterCountUsage + """Routers Count usage""" + + secret_count_limit: LastMessageRegionalQuotaSecretCountLimit + """Secret Count limit""" + + secret_count_usage: LastMessageRegionalQuotaSecretCountUsage + """Secret Count usage""" + + servergroup_count_limit: LastMessageRegionalQuotaServergroupCountLimit + """Placement Group Count limit""" + + servergroup_count_usage: LastMessageRegionalQuotaServergroupCountUsage + """Placement Group Count usage""" + + sfs_count_limit: LastMessageRegionalQuotaSfsCountLimit + """Shared file system Count limit""" + + sfs_count_usage: LastMessageRegionalQuotaSfsCountUsage + """Shared file system Count usage""" + + sfs_size_limit: LastMessageRegionalQuotaSfsSizeLimit + """Shared file system Size, GiB limit""" + + sfs_size_usage: LastMessageRegionalQuotaSfsSizeUsage + """Shared file system Size, GiB usage""" + + shared_vm_count_limit: LastMessageRegionalQuotaSharedVmCountLimit + """Basic VMs Count limit""" + + shared_vm_count_usage: LastMessageRegionalQuotaSharedVmCountUsage + """Basic VMs Count usage""" + + snapshot_schedule_count_limit: LastMessageRegionalQuotaSnapshotScheduleCountLimit + """Snapshot Schedules Count limit""" + + snapshot_schedule_count_usage: LastMessageRegionalQuotaSnapshotScheduleCountUsage + """Snapshot Schedules Count usage""" + + subnet_count_limit: LastMessageRegionalQuotaSubnetCountLimit + """Subnets Count limit""" + + subnet_count_usage: LastMessageRegionalQuotaSubnetCountUsage + """Subnets Count usage""" + + vm_count_limit: LastMessageRegionalQuotaVmCountLimit + """Instances Dedicated Count limit""" + + vm_count_usage: LastMessageRegionalQuotaVmCountUsage + """Instances Dedicated Count usage""" + + volume_count_limit: LastMessageRegionalQuotaVolumeCountLimit + """Volumes Count limit""" + + volume_count_usage: LastMessageRegionalQuotaVolumeCountUsage + """Volumes Count usage""" + + volume_size_limit: LastMessageRegionalQuotaVolumeSizeLimit + """Volumes Size, GiB limit""" + + volume_size_usage: LastMessageRegionalQuotaVolumeSizeUsage + """Volumes Size, GiB usage""" + + volume_snapshots_count_limit: LastMessageRegionalQuotaVolumeSnapshotsCountLimit + """Snapshots Count limit""" + + volume_snapshots_count_usage: LastMessageRegionalQuotaVolumeSnapshotsCountUsage + """Snapshots Count usage""" + + volume_snapshots_size_limit: LastMessageRegionalQuotaVolumeSnapshotsSizeLimit + """Snapshots Size, GiB limit""" + + volume_snapshots_size_usage: LastMessageRegionalQuotaVolumeSnapshotsSizeUsage + """Snapshots Size, GiB usage""" + + +class LastMessage(TypedDict, total=False): + """A message data""" + + global_quotas: Required[LastMessageGlobalQuotas] + """Global quota that exceed the threshold""" + + regional_quotas: Required[Iterable[LastMessageRegionalQuota]] + """Regional quota that exceed the threshold""" diff --git a/tests/api_resources/cloud/quotas/test_notification_threshold.py b/tests/api_resources/cloud/quotas/test_notification_threshold.py new file mode 100644 index 00000000..2615e45e --- /dev/null +++ b/tests/api_resources/cloud/quotas/test_notification_threshold.py @@ -0,0 +1,1166 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from gcore import Gcore, AsyncGcore +from tests.utils import assert_matches_type +from gcore.types.cloud.quotas import NotificationThreshold + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestNotificationThreshold: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + def test_method_update(self, client: Gcore) -> None: + notification_threshold = client.cloud.quotas.notification_threshold.update( + client_id=3, + threshold=95, + ) + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + @parametrize + def test_method_update_with_all_params(self, client: Gcore) -> None: + notification_threshold = client.cloud.quotas.notification_threshold.update( + client_id=3, + threshold=95, + last_message={ + "global_quotas": { + "inference_cpu_millicore_count_limit": { + "limit": 10, + "usage": 8, + }, + "inference_cpu_millicore_count_usage": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_a100_count_limit": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_a100_count_usage": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_h100_count_limit": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_h100_count_usage": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_l40s_count_limit": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_l40s_count_usage": { + "limit": 10, + "usage": 8, + }, + "inference_instance_count_limit": { + "limit": 10, + "usage": 8, + }, + "inference_instance_count_usage": { + "limit": 10, + "usage": 8, + }, + "keypair_count_limit": { + "limit": 10, + "usage": 8, + }, + "keypair_count_usage": { + "limit": 10, + "usage": 8, + }, + "project_count_limit": { + "limit": 10, + "usage": 8, + }, + "project_count_usage": { + "limit": 10, + "usage": 8, + }, + }, + "regional_quotas": [ + { + "region_id": 2, + "region_name": "Luxembourg", + "baremetal_basic_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_basic_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_a100_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_a100_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_h100_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_h100_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_h200_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_h200_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_l40s_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_l40s_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_hf_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_hf_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_infrastructure_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_infrastructure_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_network_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_network_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_storage_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_storage_count_usage": { + "limit": 10, + "usage": 8, + }, + "caas_container_count_limit": { + "limit": 10, + "usage": 8, + }, + "caas_container_count_usage": { + "limit": 10, + "usage": 8, + }, + "caas_cpu_count_limit": { + "limit": 10, + "usage": 8, + }, + "caas_cpu_count_usage": { + "limit": 10, + "usage": 8, + }, + "caas_gpu_count_limit": { + "limit": 10, + "usage": 8, + }, + "caas_gpu_count_usage": { + "limit": 10, + "usage": 8, + }, + "caas_ram_size_limit": { + "limit": 10, + "usage": 8, + }, + "caas_ram_size_usage": { + "limit": 10, + "usage": 8, + }, + "cluster_count_limit": { + "limit": 10, + "usage": 8, + }, + "cluster_count_usage": { + "limit": 10, + "usage": 8, + }, + "cpu_count_limit": { + "limit": 10, + "usage": 8, + }, + "cpu_count_usage": { + "limit": 10, + "usage": 8, + }, + "dbaas_postgres_cluster_count_limit": { + "limit": 10, + "usage": 8, + }, + "dbaas_postgres_cluster_count_usage": { + "limit": 10, + "usage": 8, + }, + "external_ip_count_limit": { + "limit": 10, + "usage": 8, + }, + "external_ip_count_usage": { + "limit": 10, + "usage": 8, + }, + "faas_cpu_count_limit": { + "limit": 10, + "usage": 8, + }, + "faas_cpu_count_usage": { + "limit": 10, + "usage": 8, + }, + "faas_function_count_limit": { + "limit": 10, + "usage": 8, + }, + "faas_function_count_usage": { + "limit": 10, + "usage": 8, + }, + "faas_namespace_count_limit": { + "limit": 10, + "usage": 8, + }, + "faas_namespace_count_usage": { + "limit": 10, + "usage": 8, + }, + "faas_ram_size_limit": { + "limit": 10, + "usage": 8, + }, + "faas_ram_size_usage": { + "limit": 10, + "usage": 8, + }, + "firewall_count_limit": { + "limit": 10, + "usage": 8, + }, + "firewall_count_usage": { + "limit": 10, + "usage": 8, + }, + "floating_count_limit": { + "limit": 10, + "usage": 8, + }, + "floating_count_usage": { + "limit": 10, + "usage": 8, + }, + "gpu_count_limit": { + "limit": 10, + "usage": 8, + }, + "gpu_count_usage": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_a100_count_limit": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_a100_count_usage": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_h100_count_limit": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_h100_count_usage": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_h200_count_limit": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_h200_count_usage": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_l40s_count_limit": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_l40s_count_usage": { + "limit": 10, + "usage": 8, + }, + "image_count_limit": { + "limit": 10, + "usage": 8, + }, + "image_count_usage": { + "limit": 10, + "usage": 8, + }, + "image_size_limit": { + "limit": 10, + "usage": 8, + }, + "image_size_usage": { + "limit": 10, + "usage": 8, + }, + "ipu_count_limit": { + "limit": 10, + "usage": 8, + }, + "ipu_count_usage": { + "limit": 10, + "usage": 8, + }, + "laas_topic_count_limit": { + "limit": 10, + "usage": 8, + }, + "laas_topic_count_usage": { + "limit": 10, + "usage": 8, + }, + "loadbalancer_count_limit": { + "limit": 10, + "usage": 8, + }, + "loadbalancer_count_usage": { + "limit": 10, + "usage": 8, + }, + "network_count_limit": { + "limit": 10, + "usage": 8, + }, + "network_count_usage": { + "limit": 10, + "usage": 8, + }, + "ram_limit": { + "limit": 10, + "usage": 8, + }, + "ram_usage": { + "limit": 10, + "usage": 8, + }, + "registry_count_limit": { + "limit": 10, + "usage": 8, + }, + "registry_count_usage": { + "limit": 10, + "usage": 8, + }, + "registry_storage_limit": { + "limit": 10, + "usage": 8, + }, + "registry_storage_usage": { + "limit": 10, + "usage": 8, + }, + "router_count_limit": { + "limit": 10, + "usage": 8, + }, + "router_count_usage": { + "limit": 10, + "usage": 8, + }, + "secret_count_limit": { + "limit": 10, + "usage": 8, + }, + "secret_count_usage": { + "limit": 10, + "usage": 8, + }, + "servergroup_count_limit": { + "limit": 10, + "usage": 8, + }, + "servergroup_count_usage": { + "limit": 10, + "usage": 8, + }, + "sfs_count_limit": { + "limit": 10, + "usage": 8, + }, + "sfs_count_usage": { + "limit": 10, + "usage": 8, + }, + "sfs_size_limit": { + "limit": 10, + "usage": 8, + }, + "sfs_size_usage": { + "limit": 10, + "usage": 8, + }, + "shared_vm_count_limit": { + "limit": 10, + "usage": 8, + }, + "shared_vm_count_usage": { + "limit": 10, + "usage": 8, + }, + "snapshot_schedule_count_limit": { + "limit": 10, + "usage": 8, + }, + "snapshot_schedule_count_usage": { + "limit": 10, + "usage": 8, + }, + "subnet_count_limit": { + "limit": 10, + "usage": 8, + }, + "subnet_count_usage": { + "limit": 10, + "usage": 8, + }, + "vm_count_limit": { + "limit": 10, + "usage": 8, + }, + "vm_count_usage": { + "limit": 10, + "usage": 8, + }, + "volume_count_limit": { + "limit": 10, + "usage": 8, + }, + "volume_count_usage": { + "limit": 10, + "usage": 8, + }, + "volume_size_limit": { + "limit": 10, + "usage": 8, + }, + "volume_size_usage": { + "limit": 10, + "usage": 8, + }, + "volume_snapshots_count_limit": { + "limit": 10, + "usage": 8, + }, + "volume_snapshots_count_usage": { + "limit": 10, + "usage": 8, + }, + "volume_snapshots_size_limit": { + "limit": 10, + "usage": 8, + }, + "volume_snapshots_size_usage": { + "limit": 10, + "usage": 8, + }, + } + ], + }, + last_sending=None, + ) + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + @parametrize + def test_raw_response_update(self, client: Gcore) -> None: + response = client.cloud.quotas.notification_threshold.with_raw_response.update( + client_id=3, + threshold=95, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + notification_threshold = response.parse() + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + @parametrize + def test_streaming_response_update(self, client: Gcore) -> None: + with client.cloud.quotas.notification_threshold.with_streaming_response.update( + client_id=3, + threshold=95, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + notification_threshold = response.parse() + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_delete(self, client: Gcore) -> None: + notification_threshold = client.cloud.quotas.notification_threshold.delete( + 3, + ) + assert notification_threshold is None + + @parametrize + def test_raw_response_delete(self, client: Gcore) -> None: + response = client.cloud.quotas.notification_threshold.with_raw_response.delete( + 3, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + notification_threshold = response.parse() + assert notification_threshold is None + + @parametrize + def test_streaming_response_delete(self, client: Gcore) -> None: + with client.cloud.quotas.notification_threshold.with_streaming_response.delete( + 3, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + notification_threshold = response.parse() + assert notification_threshold is None + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_get(self, client: Gcore) -> None: + notification_threshold = client.cloud.quotas.notification_threshold.get( + 3, + ) + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + @parametrize + def test_raw_response_get(self, client: Gcore) -> None: + response = client.cloud.quotas.notification_threshold.with_raw_response.get( + 3, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + notification_threshold = response.parse() + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + @parametrize + def test_streaming_response_get(self, client: Gcore) -> None: + with client.cloud.quotas.notification_threshold.with_streaming_response.get( + 3, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + notification_threshold = response.parse() + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncNotificationThreshold: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_update(self, async_client: AsyncGcore) -> None: + notification_threshold = await async_client.cloud.quotas.notification_threshold.update( + client_id=3, + threshold=95, + ) + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + @parametrize + async def test_method_update_with_all_params(self, async_client: AsyncGcore) -> None: + notification_threshold = await async_client.cloud.quotas.notification_threshold.update( + client_id=3, + threshold=95, + last_message={ + "global_quotas": { + "inference_cpu_millicore_count_limit": { + "limit": 10, + "usage": 8, + }, + "inference_cpu_millicore_count_usage": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_a100_count_limit": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_a100_count_usage": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_h100_count_limit": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_h100_count_usage": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_l40s_count_limit": { + "limit": 10, + "usage": 8, + }, + "inference_gpu_l40s_count_usage": { + "limit": 10, + "usage": 8, + }, + "inference_instance_count_limit": { + "limit": 10, + "usage": 8, + }, + "inference_instance_count_usage": { + "limit": 10, + "usage": 8, + }, + "keypair_count_limit": { + "limit": 10, + "usage": 8, + }, + "keypair_count_usage": { + "limit": 10, + "usage": 8, + }, + "project_count_limit": { + "limit": 10, + "usage": 8, + }, + "project_count_usage": { + "limit": 10, + "usage": 8, + }, + }, + "regional_quotas": [ + { + "region_id": 2, + "region_name": "Luxembourg", + "baremetal_basic_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_basic_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_a100_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_a100_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_h100_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_h100_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_h200_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_h200_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_l40s_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_gpu_l40s_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_hf_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_hf_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_infrastructure_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_infrastructure_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_network_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_network_count_usage": { + "limit": 10, + "usage": 8, + }, + "baremetal_storage_count_limit": { + "limit": 10, + "usage": 8, + }, + "baremetal_storage_count_usage": { + "limit": 10, + "usage": 8, + }, + "caas_container_count_limit": { + "limit": 10, + "usage": 8, + }, + "caas_container_count_usage": { + "limit": 10, + "usage": 8, + }, + "caas_cpu_count_limit": { + "limit": 10, + "usage": 8, + }, + "caas_cpu_count_usage": { + "limit": 10, + "usage": 8, + }, + "caas_gpu_count_limit": { + "limit": 10, + "usage": 8, + }, + "caas_gpu_count_usage": { + "limit": 10, + "usage": 8, + }, + "caas_ram_size_limit": { + "limit": 10, + "usage": 8, + }, + "caas_ram_size_usage": { + "limit": 10, + "usage": 8, + }, + "cluster_count_limit": { + "limit": 10, + "usage": 8, + }, + "cluster_count_usage": { + "limit": 10, + "usage": 8, + }, + "cpu_count_limit": { + "limit": 10, + "usage": 8, + }, + "cpu_count_usage": { + "limit": 10, + "usage": 8, + }, + "dbaas_postgres_cluster_count_limit": { + "limit": 10, + "usage": 8, + }, + "dbaas_postgres_cluster_count_usage": { + "limit": 10, + "usage": 8, + }, + "external_ip_count_limit": { + "limit": 10, + "usage": 8, + }, + "external_ip_count_usage": { + "limit": 10, + "usage": 8, + }, + "faas_cpu_count_limit": { + "limit": 10, + "usage": 8, + }, + "faas_cpu_count_usage": { + "limit": 10, + "usage": 8, + }, + "faas_function_count_limit": { + "limit": 10, + "usage": 8, + }, + "faas_function_count_usage": { + "limit": 10, + "usage": 8, + }, + "faas_namespace_count_limit": { + "limit": 10, + "usage": 8, + }, + "faas_namespace_count_usage": { + "limit": 10, + "usage": 8, + }, + "faas_ram_size_limit": { + "limit": 10, + "usage": 8, + }, + "faas_ram_size_usage": { + "limit": 10, + "usage": 8, + }, + "firewall_count_limit": { + "limit": 10, + "usage": 8, + }, + "firewall_count_usage": { + "limit": 10, + "usage": 8, + }, + "floating_count_limit": { + "limit": 10, + "usage": 8, + }, + "floating_count_usage": { + "limit": 10, + "usage": 8, + }, + "gpu_count_limit": { + "limit": 10, + "usage": 8, + }, + "gpu_count_usage": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_a100_count_limit": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_a100_count_usage": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_h100_count_limit": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_h100_count_usage": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_h200_count_limit": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_h200_count_usage": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_l40s_count_limit": { + "limit": 10, + "usage": 8, + }, + "gpu_virtual_l40s_count_usage": { + "limit": 10, + "usage": 8, + }, + "image_count_limit": { + "limit": 10, + "usage": 8, + }, + "image_count_usage": { + "limit": 10, + "usage": 8, + }, + "image_size_limit": { + "limit": 10, + "usage": 8, + }, + "image_size_usage": { + "limit": 10, + "usage": 8, + }, + "ipu_count_limit": { + "limit": 10, + "usage": 8, + }, + "ipu_count_usage": { + "limit": 10, + "usage": 8, + }, + "laas_topic_count_limit": { + "limit": 10, + "usage": 8, + }, + "laas_topic_count_usage": { + "limit": 10, + "usage": 8, + }, + "loadbalancer_count_limit": { + "limit": 10, + "usage": 8, + }, + "loadbalancer_count_usage": { + "limit": 10, + "usage": 8, + }, + "network_count_limit": { + "limit": 10, + "usage": 8, + }, + "network_count_usage": { + "limit": 10, + "usage": 8, + }, + "ram_limit": { + "limit": 10, + "usage": 8, + }, + "ram_usage": { + "limit": 10, + "usage": 8, + }, + "registry_count_limit": { + "limit": 10, + "usage": 8, + }, + "registry_count_usage": { + "limit": 10, + "usage": 8, + }, + "registry_storage_limit": { + "limit": 10, + "usage": 8, + }, + "registry_storage_usage": { + "limit": 10, + "usage": 8, + }, + "router_count_limit": { + "limit": 10, + "usage": 8, + }, + "router_count_usage": { + "limit": 10, + "usage": 8, + }, + "secret_count_limit": { + "limit": 10, + "usage": 8, + }, + "secret_count_usage": { + "limit": 10, + "usage": 8, + }, + "servergroup_count_limit": { + "limit": 10, + "usage": 8, + }, + "servergroup_count_usage": { + "limit": 10, + "usage": 8, + }, + "sfs_count_limit": { + "limit": 10, + "usage": 8, + }, + "sfs_count_usage": { + "limit": 10, + "usage": 8, + }, + "sfs_size_limit": { + "limit": 10, + "usage": 8, + }, + "sfs_size_usage": { + "limit": 10, + "usage": 8, + }, + "shared_vm_count_limit": { + "limit": 10, + "usage": 8, + }, + "shared_vm_count_usage": { + "limit": 10, + "usage": 8, + }, + "snapshot_schedule_count_limit": { + "limit": 10, + "usage": 8, + }, + "snapshot_schedule_count_usage": { + "limit": 10, + "usage": 8, + }, + "subnet_count_limit": { + "limit": 10, + "usage": 8, + }, + "subnet_count_usage": { + "limit": 10, + "usage": 8, + }, + "vm_count_limit": { + "limit": 10, + "usage": 8, + }, + "vm_count_usage": { + "limit": 10, + "usage": 8, + }, + "volume_count_limit": { + "limit": 10, + "usage": 8, + }, + "volume_count_usage": { + "limit": 10, + "usage": 8, + }, + "volume_size_limit": { + "limit": 10, + "usage": 8, + }, + "volume_size_usage": { + "limit": 10, + "usage": 8, + }, + "volume_snapshots_count_limit": { + "limit": 10, + "usage": 8, + }, + "volume_snapshots_count_usage": { + "limit": 10, + "usage": 8, + }, + "volume_snapshots_size_limit": { + "limit": 10, + "usage": 8, + }, + "volume_snapshots_size_usage": { + "limit": 10, + "usage": 8, + }, + } + ], + }, + last_sending=None, + ) + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + @parametrize + async def test_raw_response_update(self, async_client: AsyncGcore) -> None: + response = await async_client.cloud.quotas.notification_threshold.with_raw_response.update( + client_id=3, + threshold=95, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + notification_threshold = await response.parse() + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + @parametrize + async def test_streaming_response_update(self, async_client: AsyncGcore) -> None: + async with async_client.cloud.quotas.notification_threshold.with_streaming_response.update( + client_id=3, + threshold=95, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + notification_threshold = await response.parse() + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_delete(self, async_client: AsyncGcore) -> None: + notification_threshold = await async_client.cloud.quotas.notification_threshold.delete( + 3, + ) + assert notification_threshold is None + + @parametrize + async def test_raw_response_delete(self, async_client: AsyncGcore) -> None: + response = await async_client.cloud.quotas.notification_threshold.with_raw_response.delete( + 3, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + notification_threshold = await response.parse() + assert notification_threshold is None + + @parametrize + async def test_streaming_response_delete(self, async_client: AsyncGcore) -> None: + async with async_client.cloud.quotas.notification_threshold.with_streaming_response.delete( + 3, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + notification_threshold = await response.parse() + assert notification_threshold is None + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_get(self, async_client: AsyncGcore) -> None: + notification_threshold = await async_client.cloud.quotas.notification_threshold.get( + 3, + ) + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + @parametrize + async def test_raw_response_get(self, async_client: AsyncGcore) -> None: + response = await async_client.cloud.quotas.notification_threshold.with_raw_response.get( + 3, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + notification_threshold = await response.parse() + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + @parametrize + async def test_streaming_response_get(self, async_client: AsyncGcore) -> None: + async with async_client.cloud.quotas.notification_threshold.with_streaming_response.get( + 3, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + notification_threshold = await response.parse() + assert_matches_type(NotificationThreshold, notification_threshold, path=["response"]) + + assert cast(Any, response.is_closed) is True From 53edda622fa877f062e39fb507b04cc8dec39c3a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 12:08:51 +0000 Subject: [PATCH 22/25] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index ea487e6e..40092952 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 655 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-c4c09a01a5791ea1d7c33e3c7ae09130b461848a881644003c4f0d7aaabef8b6.yml openapi_spec_hash: 01f8b65e87e0dd05dec110fa43c4553f -config_hash: f5f1fe25a10b69d0a7dd45d73ee52a15 +config_hash: 4c32a90ef64abf4c3a9f0fc71ad80945 From 7aa0b600257cc4c9ddf0d8ce3af1ac709a11f3ec Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 12:39:16 +0000 Subject: [PATCH 23/25] chore(internal): update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 95ceb189..3824f4c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .prism.log +.stdy.log _dev __pycache__ From da8309d9c3e11226c5a8fc7ee7ac35331055d521 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 13:56:21 +0000 Subject: [PATCH 24/25] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 40092952..fc18f90f 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 655 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-c4c09a01a5791ea1d7c33e3c7ae09130b461848a881644003c4f0d7aaabef8b6.yml openapi_spec_hash: 01f8b65e87e0dd05dec110fa43c4553f -config_hash: 4c32a90ef64abf4c3a9f0fc71ad80945 +config_hash: 85e457318a30eaef6f8360fe795eec52 From 67626513096adc2f3d3f9aa79b82bd71d21c0e9f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 13:56:46 +0000 Subject: [PATCH 25/25] release: 0.39.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 39 +++++++++++++++++++++++++++++++++++ pyproject.toml | 2 +- src/gcore/_version.py | 2 +- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 8ea07c9a..1b5dc400 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.38.0" + ".": "0.39.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index d1b50eac..6d106a03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,44 @@ # Changelog +## 0.39.0 (2026-03-23) + +Full Changelog: [v0.38.0...v0.39.0](https://github.com/G-Core/gcore-python/compare/v0.38.0...v0.39.0) + +### ⚠ BREAKING CHANGES + +* **waap:** replace deprecated domain-scoped traffic/requests endpoints with account-scoped analytics + +### Features + +* **api:** aggregated API specs update ([998707e](https://github.com/G-Core/gcore-python/commit/998707ec275cc269044a347c5b858d460e2ae491)) +* **api:** aggregated API specs update ([1617eb3](https://github.com/G-Core/gcore-python/commit/1617eb374498f1b445a8466163d42c4b49ff4ca5)) +* **api:** aggregated API specs update ([938f4ae](https://github.com/G-Core/gcore-python/commit/938f4aedb8f61a95628ceb111df6e716f3f8ca70)) +* **api:** Revert "feat(cdn): enable terraform support for cdn_rule_template" ([893f007](https://github.com/G-Core/gcore-python/commit/893f007fa4eb3323367748b55c21925e715de62a)) +* **cdn:** enable terraform support for cdn_rule_template ([bae5faf](https://github.com/G-Core/gcore-python/commit/bae5faff732a79d6bba81563075b61f7f4d450dd)) +* **cloud:** add create_and_poll and delete_and_poll methods for volume snapshots ([1c06cca](https://github.com/G-Core/gcore-python/commit/1c06ccaaf7d3256a1c33b53c6ca913700ed1da68)) +* **cloud:** add notification_threshold subresource to quotas ([7a2de37](https://github.com/G-Core/gcore-python/commit/7a2de3750cd3737cbbbc0ba0d3317c08368345a8)) +* **waap:** replace deprecated domain-scoped traffic/requests endpoints with account-scoped analytics ([4321632](https://github.com/G-Core/gcore-python/commit/43216323d5aa93acb990d6db686e785f730a9323)) + + +### Bug Fixes + +* **deps:** bump minimum typing-extensions version ([b31cabd](https://github.com/G-Core/gcore-python/commit/b31cabd05d4a00b17843e50cb04cd19b213c7841)) +* **pydantic:** do not pass `by_alias` unless set ([5c6f9bc](https://github.com/G-Core/gcore-python/commit/5c6f9bcfbd18fc5e22a4afeafe91c8d6a9587cb1)) +* sanitize endpoint path params ([c4dbd22](https://github.com/G-Core/gcore-python/commit/c4dbd22cb198bc087fa998a4b090997dc4078103)) + + +### Chores + +* **internal:** tweak CI branches ([9d190fe](https://github.com/G-Core/gcore-python/commit/9d190fe9d244981df99f5b9bd2183de0b8f0bd1b)) +* **internal:** update gitignore ([7aa0b60](https://github.com/G-Core/gcore-python/commit/7aa0b600257cc4c9ddf0d8ce3af1ac709a11f3ec)) +* **tests:** bump steady to v0.19.4 ([379eb58](https://github.com/G-Core/gcore-python/commit/379eb58258a9f5e24d9108ed1efdeb3c68f2a4f4)) +* **tests:** bump steady to v0.19.5 ([660410f](https://github.com/G-Core/gcore-python/commit/660410fc9038c0dc349911ba9def7e1fa2aad3a7)) + + +### Refactors + +* **tests:** switch from prism to steady ([28a7208](https://github.com/G-Core/gcore-python/commit/28a7208e84d438e550556f8b41c1dca8f6283b95)) + ## 0.38.0 (2026-03-16) Full Changelog: [v0.37.0...v0.38.0](https://github.com/G-Core/gcore-python/compare/v0.37.0...v0.38.0) diff --git a/pyproject.toml b/pyproject.toml index ad7f957e..c5374241 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "gcore" -version = "0.38.0" +version = "0.39.0" description = "The official Python library for the gcore API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/gcore/_version.py b/src/gcore/_version.py index ee385833..709616bd 100644 --- a/src/gcore/_version.py +++ b/src/gcore/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "gcore" -__version__ = "0.38.0" # x-release-please-version +__version__ = "0.39.0" # x-release-please-version