Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.11.0"
".": "0.12.0"
}
6 changes: 3 additions & 3 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 523
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-69c2f202e608b625930fb755ef34ae2fa30acce4fa987889e10402324aaf689e.yml
openapi_spec_hash: f6aa7b95639f6eb639e408ad321f2861
config_hash: 53f1995f46a0e2f7e747e65bafa3d6e0
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-fa5e3eb5c4c01c6be5a8d036640779fa59a1931c596245748ed28601213caa3b.yml
openapi_spec_hash: 2ad55753d983df577077b3ce156ac4ca
config_hash: 94a708396796faa210065e6aa3afebc2
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# Changelog

## 0.12.0 (2025-09-11)

Full Changelog: [v0.11.0...v0.12.0](https://github.com/G-Core/gcore-python/compare/v0.11.0...v0.12.0)

### Features

* **api:** aggregated API specs update ([3fbc8f1](https://github.com/G-Core/gcore-python/commit/3fbc8f1a6126f4cb6d9e6a0aff7f35f67f77ec6f))
* **cloud:** add create_and_poll() and delete_and_poll() to reserved fixed ips ([6e6efc0](https://github.com/G-Core/gcore-python/commit/6e6efc03de62b895199a043e0cf1b396aefb0d01))
* **cloud:** add polling methods to volumes ([3537e8c](https://github.com/G-Core/gcore-python/commit/3537e8c5b6ebd0500868dfc2b14bfeba735fe1f5))


### Refactors

* **storage:** use v2 endpoint ([4a00499](https://github.com/G-Core/gcore-python/commit/4a00499c3bc80a6f06e476bd1c0d544bd1c46cef))

## 0.11.0 (2025-09-09)

Full Changelog: [v0.10.0...v0.11.0](https://github.com/G-Core/gcore-python/compare/v0.10.0...v0.11.0)
Expand Down
2 changes: 1 addition & 1 deletion api.md
Original file line number Diff line number Diff line change
Expand Up @@ -1987,7 +1987,7 @@ from gcore.types.storage import Storage
Methods:

- <code title="post /storage/provisioning/v2/storage">client.storage.<a href="./src/gcore/resources/storage/storage.py">create</a>(\*\*<a href="src/gcore/types/storage/storage_create_params.py">params</a>) -> <a href="./src/gcore/types/storage/storage.py">Storage</a></code>
- <code title="post /storage/provisioning/v1/storage/{storage_id}">client.storage.<a href="./src/gcore/resources/storage/storage.py">update</a>(storage_id, \*\*<a href="src/gcore/types/storage/storage_update_params.py">params</a>) -> <a href="./src/gcore/types/storage/storage.py">Storage</a></code>
- <code title="patch /storage/provisioning/v2/storage/{storage_id}">client.storage.<a href="./src/gcore/resources/storage/storage.py">update</a>(storage_id, \*\*<a href="src/gcore/types/storage/storage_update_params.py">params</a>) -> <a href="./src/gcore/types/storage/storage.py">Storage</a></code>
- <code title="get /storage/provisioning/v3/storage">client.storage.<a href="./src/gcore/resources/storage/storage.py">list</a>(\*\*<a href="src/gcore/types/storage/storage_list_params.py">params</a>) -> <a href="./src/gcore/types/storage/storage.py">SyncOffsetPage[Storage]</a></code>
- <code title="delete /storage/provisioning/v1/storage/{storage_id}">client.storage.<a href="./src/gcore/resources/storage/storage.py">delete</a>(storage_id) -> None</code>
- <code title="get /storage/provisioning/v1/storage/{storage_id}">client.storage.<a href="./src/gcore/resources/storage/storage.py">get</a>(storage_id) -> <a href="./src/gcore/types/storage/storage.py">Storage</a></code>
Expand Down
9 changes: 2 additions & 7 deletions examples/cloud/reserved_fixed_ips.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,11 @@ def main() -> None:

def create_reserved_fixed_ip(*, client: Gcore) -> ReservedFixedIP:
print("\n=== CREATE RESERVED FIXED IP ===")
task_list = client.cloud.reserved_fixed_ips.create(
port = client.cloud.reserved_fixed_ips.create_and_poll(
type="external",
ip_family="ipv4",
is_vip=False,
)
task = client.cloud.tasks.poll(task_list.tasks[0])
if not task.created_resources or not task.created_resources.ports or len(task.created_resources.ports) != 1:
raise RuntimeError("Expected exactly one port created in the task result")
port = client.cloud.reserved_fixed_ips.get(task.created_resources.ports[0])
print(f"Created reserved fixed IP: ID={port.port_id}, name={port.name}, IP={port.fixed_ip_address}")
print("========================")
return port
Expand Down Expand Up @@ -93,8 +89,7 @@ def list_connected_ports(*, client: Gcore, port_id: str) -> None:

def delete_reserved_fixed_ip(*, client: Gcore, port_id: str) -> None:
print("\n=== DELETE RESERVED FIXED IP ===")
task_list = client.cloud.reserved_fixed_ips.delete(port_id)
client.cloud.tasks.poll(task_list.tasks[0])
client.cloud.reserved_fixed_ips.delete_and_poll(port_id)
print(f"Deleted reserved fixed IP: ID={port_id}")
print("========================")

Expand Down
9 changes: 2 additions & 7 deletions examples/cloud/reserved_fixed_ips_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,11 @@ async def main() -> None:

async def create_reserved_fixed_ip(*, client: AsyncGcore) -> ReservedFixedIP:
print("\n=== CREATE RESERVED FIXED IP ===")
task_list = await client.cloud.reserved_fixed_ips.create(
port = await client.cloud.reserved_fixed_ips.create_and_poll(
type="external",
ip_family="ipv4",
is_vip=False,
)
task = await client.cloud.tasks.poll(task_list.tasks[0])
if not task.created_resources or not task.created_resources.ports or len(task.created_resources.ports) != 1:
raise RuntimeError("Expected exactly one port created in the task result")
port = await client.cloud.reserved_fixed_ips.get(task.created_resources.ports[0])
print(f"Created reserved fixed IP: ID={port.port_id}, name={port.name}, IP={port.fixed_ip_address}")
print("========================")
return port
Expand Down Expand Up @@ -97,8 +93,7 @@ async def list_connected_ports(*, client: AsyncGcore, port_id: str) -> None:

async def delete_reserved_fixed_ip(*, client: AsyncGcore, port_id: str) -> None:
print("\n=== DELETE RESERVED FIXED IP ===")
task_list = await client.cloud.reserved_fixed_ips.delete(port_id)
await client.cloud.tasks.poll(task_list.tasks[0])
await client.cloud.reserved_fixed_ips.delete_and_poll(port_id)
print(f"Deleted reserved fixed IP: ID={port_id}")
print("========================")

Expand Down
30 changes: 10 additions & 20 deletions examples/cloud/volumes.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,16 @@ def main() -> None:

def create_volume(*, client: Gcore) -> str:
print("\n=== CREATE VOLUME ===")
response = client.cloud.volumes.create(
volume = client.cloud.volumes.create_and_poll(
name="gcore-go-example",
size=1,
source="new-volume",
)
task = client.cloud.tasks.poll(task_id=response.tasks[0])
if task.created_resources is None or task.created_resources.volumes is None:
raise RuntimeError("Task completed but created_resources or volumes is missing")
volume_id: str = task.created_resources.volumes[0]
print(f"Created volume: ID={volume_id}")
if not volume.id:
raise RuntimeError("Failed to create volume")
print(f"Created volume: ID={volume.id}")
print("========================")
return volume_id
return volume.id


def list_volumes(*, client: Gcore) -> None:
Expand Down Expand Up @@ -75,18 +73,14 @@ def update_volume(*, client: Gcore, volume_id: str) -> None:

def attach_to_instance(*, client: Gcore, volume_id: str, instance_id: str) -> None:
print("\n=== ATTACH TO INSTANCE ===")
response = client.cloud.volumes.attach_to_instance(volume_id=volume_id, instance_id=instance_id)
task_id = response.tasks[0]
client.cloud.tasks.poll(task_id=task_id)
client.cloud.volumes.attach_to_instance_and_poll(volume_id=volume_id, instance_id=instance_id)
print(f"Attached volume to instance: volume_id={volume_id}, instance_id={instance_id}")
print("========================")


def detach_from_instance(*, client: Gcore, volume_id: str, instance_id: str) -> None:
print("\n=== DETACH FROM INSTANCE ===")
response = client.cloud.volumes.detach_from_instance(volume_id=volume_id, instance_id=instance_id)
task_id = response.tasks[0]
client.cloud.tasks.poll(task_id=task_id)
client.cloud.volumes.detach_from_instance_and_poll(volume_id=volume_id, instance_id=instance_id)
print(f"Detached volume from instance: volume_id={volume_id}, instance_id={instance_id}")
print("========================")

Expand All @@ -100,18 +94,14 @@ def change_type(*, client: Gcore, volume_id: str) -> None:

def resize(*, client: Gcore, volume_id: str) -> None:
print("\n=== RESIZE ===")
response = client.cloud.volumes.resize(volume_id=volume_id, size=2)
task_id = response.tasks[0]
client.cloud.tasks.poll(task_id=task_id)
print(f"Resized volume: ID={volume_id}, size=2 GiB")
volume = client.cloud.volumes.resize_and_poll(volume_id=volume_id, size=2)
print(f"Resized volume: ID={volume.id}, size={volume.size} GiB")
print("========================")


def delete_volume(*, client: Gcore, volume_id: str) -> None:
print("\n=== DELETE VOLUME ===")
response = client.cloud.volumes.delete(volume_id=volume_id)
task_id = response.tasks[0]
client.cloud.tasks.poll(task_id=task_id)
client.cloud.volumes.delete_and_poll(volume_id=volume_id)
print(f"Deleted volume: ID={volume_id}")
print("========================")

Expand Down
30 changes: 10 additions & 20 deletions examples/cloud/volumes_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,16 @@ async def main() -> None:

async def create_volume(*, client: AsyncGcore) -> str:
print("\n=== CREATE VOLUME ===")
response = await client.cloud.volumes.create(
volume = await client.cloud.volumes.create_and_poll(
name="gcore-go-example",
size=1,
source="new-volume",
)
task = await client.cloud.tasks.poll(task_id=response.tasks[0])
if task.created_resources is None or task.created_resources.volumes is None:
raise RuntimeError("Task completed but created_resources or volumes is missing")
volume_id: str = task.created_resources.volumes[0]
print(f"Created volume: ID={volume_id}")
if not volume.id:
raise RuntimeError("Failed to create volume")
print(f"Created volume: ID={volume.id}")
print("========================")
return volume_id
return volume.id


async def list_volumes(*, client: AsyncGcore) -> None:
Expand Down Expand Up @@ -77,18 +75,14 @@ async def update_volume(*, client: AsyncGcore, volume_id: str) -> None:

async def attach_to_instance(*, client: AsyncGcore, volume_id: str, instance_id: str) -> None:
print("\n=== ATTACH TO INSTANCE ===")
response = await client.cloud.volumes.attach_to_instance(volume_id=volume_id, instance_id=instance_id)
task_id = response.tasks[0]
await client.cloud.tasks.poll(task_id=task_id)
await client.cloud.volumes.attach_to_instance_and_poll(volume_id=volume_id, instance_id=instance_id)
print(f"Attached volume to instance: volume_id={volume_id}, instance_id={instance_id}")
print("========================")


async def detach_from_instance(*, client: AsyncGcore, volume_id: str, instance_id: str) -> None:
print("\n=== DETACH FROM INSTANCE ===")
response = await client.cloud.volumes.detach_from_instance(volume_id=volume_id, instance_id=instance_id)
task_id = response.tasks[0]
await client.cloud.tasks.poll(task_id=task_id)
await client.cloud.volumes.detach_from_instance_and_poll(volume_id=volume_id, instance_id=instance_id)
print(f"Detached volume from instance: volume_id={volume_id}, instance_id={instance_id}")
print("========================")

Expand All @@ -102,18 +96,14 @@ async def change_type(*, client: AsyncGcore, volume_id: str) -> None:

async def resize(*, client: AsyncGcore, volume_id: str) -> None:
print("\n=== RESIZE ===")
response = await client.cloud.volumes.resize(volume_id=volume_id, size=2)
task_id = response.tasks[0]
await client.cloud.tasks.poll(task_id=task_id)
print(f"Resized volume: ID={volume_id}, size=2 GiB")
volume = await client.cloud.volumes.resize_and_poll(volume_id=volume_id, size=2)
print(f"Resized volume: ID={volume.id}, size={volume.size} GiB")
print("========================")


async def delete_volume(*, client: AsyncGcore, volume_id: str) -> None:
print("\n=== DELETE VOLUME ===")
response = await client.cloud.volumes.delete(volume_id=volume_id)
task_id = response.tasks[0]
await client.cloud.tasks.poll(task_id=task_id)
await client.cloud.volumes.delete_and_poll(volume_id=volume_id)
print(f"Deleted volume: ID={volume_id}")
print("========================")

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "gcore"
version = "0.11.0"
version = "0.12.0"
description = "The official Python library for the gcore API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion src/gcore/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "gcore"
__version__ = "0.11.0" # x-release-please-version
__version__ = "0.12.0" # x-release-please-version
Loading