Skip to content

Commit a42b974

Browse files
feat(cloud): add reserved fixed ips examples
Refs GCLOUD2-18673
1 parent fbe3508 commit a42b974

2 files changed

Lines changed: 203 additions & 0 deletions

File tree

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
from gcore import Gcore
2+
from gcore.pagination import SyncOffsetPage
3+
from gcore.types.cloud import ReservedFixedIP
4+
5+
6+
def create_reserved_fixed_ip(*, client: Gcore) -> ReservedFixedIP:
7+
print("\n=== CREATE RESERVED FIXED IP ===")
8+
task_list = client.cloud.reserved_fixed_ips.create(
9+
type="external",
10+
ip_family="ipv4",
11+
is_vip=False,
12+
)
13+
task = client.cloud.tasks.poll(task_list.tasks[0])
14+
if not task.created_resources or not task.created_resources.ports or len(task.created_resources.ports) != 1:
15+
raise RuntimeError("Expected exactly one port created in the task result")
16+
port = client.cloud.reserved_fixed_ips.get(task.created_resources.ports[0])
17+
print(f"Created reserved fixed IP: ID={port.port_id}, name={port.name}, IP={port.fixed_ip_address}")
18+
print("========================")
19+
return port
20+
21+
22+
def list_reserved_fixed_ips(*, client: Gcore) -> SyncOffsetPage[ReservedFixedIP]:
23+
print("\n=== LIST RESERVED FIXED IPS ===")
24+
reserved_ips = client.cloud.reserved_fixed_ips.list()
25+
for count, ip in enumerate(reserved_ips, 1):
26+
print(f"{count}. Reserved fixed IP: ID={ip.port_id}, name={ip.name}, status={ip.status}")
27+
print("========================")
28+
return reserved_ips
29+
30+
31+
def get_reserved_fixed_ip(*, client: Gcore, port_id: str) -> ReservedFixedIP:
32+
print("\n=== GET RESERVED FIXED IP ===")
33+
reserved_ip = client.cloud.reserved_fixed_ips.get(port_id)
34+
print(f"Reserved fixed IP: ID={reserved_ip.port_id}, name={reserved_ip.name}, status={reserved_ip.status}")
35+
print("========================")
36+
return reserved_ip
37+
38+
39+
def toggle_reserved_fixed_ip_vip(*, client: Gcore, port_id: str, is_vip: bool) -> ReservedFixedIP:
40+
print("\n=== TOGGLE RESERVED FIXED IP VIP ===")
41+
reserved_ip = client.cloud.reserved_fixed_ips.vip.toggle(port_id, is_vip=is_vip)
42+
print(
43+
f"Toggled reserved fixed IP VIP: ID={reserved_ip.port_id}, name={reserved_ip.name}, is_vip={reserved_ip.is_vip}"
44+
)
45+
print("========================")
46+
return reserved_ip
47+
48+
49+
def list_candidate_ports(*, client: Gcore, port_id: str) -> None:
50+
print("\n=== LIST CANDIDATE PORTS ===")
51+
candidate_ports = client.cloud.reserved_fixed_ips.vip.list_candidate_ports(port_id)
52+
for count, port in enumerate(candidate_ports.results, 1):
53+
print(f"{count}. Candidate port: ID={port.port_id}, instance name={port.instance_name}")
54+
print("========================")
55+
56+
57+
def list_connected_ports(*, client: Gcore, port_id: str) -> None:
58+
print("\n=== LIST CONNECTED PORTS ===")
59+
connected_ports = client.cloud.reserved_fixed_ips.vip.list_connected_ports(port_id)
60+
for count, port in enumerate(connected_ports.results, 1):
61+
print(f"{count}. Connected port: ID={port.port_id}, instance name={port.instance_name}")
62+
print("========================")
63+
64+
65+
def delete_reserved_fixed_ip(*, client: Gcore, port_id: str) -> None:
66+
print("\n=== DELETE RESERVED FIXED IP ===")
67+
task_list = client.cloud.reserved_fixed_ips.delete(port_id)
68+
client.cloud.tasks.poll(task_list.tasks[0])
69+
print(f"Deleted reserved fixed IP: ID={port_id}")
70+
print("========================")
71+
72+
73+
if __name__ == "__main__":
74+
# No need to pass the API key explicitly — it will automatically be read from the GCORE_API_KEY environment variable if omitted
75+
# api_key = os.environ.get("GCORE_API_KEY")
76+
# Will use Production API URL if omitted
77+
# base_url = os.environ.get("GCORE_BASE_URL")
78+
79+
gcore = Gcore(
80+
# api_key=api_key,
81+
# base_url=base_url,
82+
)
83+
84+
fixed_ip = create_reserved_fixed_ip(client=gcore)
85+
list_reserved_fixed_ips(client=gcore)
86+
get_reserved_fixed_ip(client=gcore, port_id=fixed_ip.port_id)
87+
88+
# VIP
89+
toggle_reserved_fixed_ip_vip(client=gcore, port_id=fixed_ip.port_id, is_vip=True)
90+
list_candidate_ports(client=gcore, port_id=fixed_ip.port_id)
91+
list_connected_ports(client=gcore, port_id=fixed_ip.port_id)
92+
# is_vip needs to be false to delete the reserved fixed IP
93+
toggle_reserved_fixed_ip_vip(client=gcore, port_id=fixed_ip.port_id, is_vip=False)
94+
95+
delete_reserved_fixed_ip(client=gcore, port_id=fixed_ip.port_id)
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
"""
2+
Example demonstrating full lifecycle of Reserved Fixed IPs resource using async client.
3+
Includes create, get, list, update (i.e. toggle VIP), and delete operations.
4+
"""
5+
6+
import asyncio
7+
8+
from gcore import AsyncGcore
9+
from gcore.pagination import AsyncOffsetPage
10+
from gcore.types.cloud import ReservedFixedIP
11+
12+
13+
async def create_reserved_fixed_ip(*, client: AsyncGcore) -> ReservedFixedIP:
14+
print("\n=== CREATE RESERVED FIXED IP ===")
15+
task_list = await client.cloud.reserved_fixed_ips.create(
16+
type="external",
17+
ip_family="ipv4",
18+
is_vip=False,
19+
)
20+
task = await client.cloud.tasks.poll(task_list.tasks[0])
21+
if not task.created_resources or not task.created_resources.ports or len(task.created_resources.ports) != 1:
22+
raise RuntimeError("Expected exactly one port created in the task result")
23+
port = await client.cloud.reserved_fixed_ips.get(task.created_resources.ports[0])
24+
print(f"Created reserved fixed IP: ID={port.port_id}, name={port.name}, IP={port.fixed_ip_address}")
25+
print("========================")
26+
return port
27+
28+
29+
async def list_reserved_fixed_ips(*, client: AsyncGcore) -> AsyncOffsetPage[ReservedFixedIP]:
30+
print("\n=== LIST RESERVED FIXED IPS ===")
31+
reserved_ips = await client.cloud.reserved_fixed_ips.list()
32+
count = 1
33+
async for ip in reserved_ips:
34+
print(f"{count}. Reserved fixed IP: ID={ip.port_id}, name={ip.name}, status={ip.status}")
35+
count += 1
36+
print("========================")
37+
return reserved_ips
38+
39+
40+
async def get_reserved_fixed_ip(*, client: AsyncGcore, port_id: str) -> ReservedFixedIP:
41+
print("\n=== GET RESERVED FIXED IP ===")
42+
reserved_ip = await client.cloud.reserved_fixed_ips.get(port_id)
43+
print(f"Reserved fixed IP: ID={reserved_ip.port_id}, name={reserved_ip.name}, status={reserved_ip.status}")
44+
print("========================")
45+
return reserved_ip
46+
47+
48+
async def toggle_reserved_fixed_ip_vip(*, client: AsyncGcore, port_id: str, is_vip: bool) -> ReservedFixedIP:
49+
print("\n=== TOGGLE RESERVED FIXED IP VIP ===")
50+
reserved_ip = await client.cloud.reserved_fixed_ips.vip.toggle(port_id, is_vip=is_vip)
51+
print(
52+
f"Toggled reserved fixed IP VIP: ID={reserved_ip.port_id}, name={reserved_ip.name}, is_vip={reserved_ip.is_vip}"
53+
)
54+
print("========================")
55+
return reserved_ip
56+
57+
58+
async def list_candidate_ports(*, client: AsyncGcore, port_id: str) -> None:
59+
print("\n=== LIST CANDIDATE PORTS ===")
60+
candidate_ports = await client.cloud.reserved_fixed_ips.vip.list_candidate_ports(port_id)
61+
for count, port in enumerate(candidate_ports.results, 1):
62+
print(f"{count}. Candidate port: ID={port.port_id}, instance name={port.instance_name}")
63+
print("========================")
64+
65+
66+
async def list_connected_ports(*, client: AsyncGcore, port_id: str) -> None:
67+
print("\n=== LIST CONNECTED PORTS ===")
68+
connected_ports = await client.cloud.reserved_fixed_ips.vip.list_connected_ports(port_id)
69+
for count, port in enumerate(connected_ports.results, 1):
70+
print(f"{count}. Connected port: ID={port.port_id}, instance name={port.instance_name}")
71+
print("========================")
72+
73+
74+
async def delete_reserved_fixed_ip(*, client: AsyncGcore, port_id: str) -> None:
75+
print("\n=== DELETE RESERVED FIXED IP ===")
76+
task_list = await client.cloud.reserved_fixed_ips.delete(port_id)
77+
await client.cloud.tasks.poll(task_list.tasks[0])
78+
print(f"Deleted reserved fixed IP: ID={port_id}")
79+
print("========================")
80+
81+
82+
async def main() -> None:
83+
# No need to pass the API key explicitly — it will automatically be read from the GCORE_API_KEY environment variable if omitted
84+
# api_key = os.environ.get("GCORE_API_KEY")
85+
# Will use Production API URL if omitted
86+
# base_url = os.environ.get("GCORE_BASE_URL")
87+
88+
gcore = AsyncGcore(
89+
# api_key=api_key,
90+
# base_url=base_url,
91+
)
92+
93+
fixed_ip = await create_reserved_fixed_ip(client=gcore)
94+
await list_reserved_fixed_ips(client=gcore)
95+
await get_reserved_fixed_ip(client=gcore, port_id=fixed_ip.port_id)
96+
97+
# VIP
98+
await toggle_reserved_fixed_ip_vip(client=gcore, port_id=fixed_ip.port_id, is_vip=True)
99+
await list_candidate_ports(client=gcore, port_id=fixed_ip.port_id)
100+
await list_connected_ports(client=gcore, port_id=fixed_ip.port_id)
101+
# is_vip needs to be false to delete the reserved fixed IP
102+
await toggle_reserved_fixed_ip_vip(client=gcore, port_id=fixed_ip.port_id, is_vip=False)
103+
104+
await delete_reserved_fixed_ip(client=gcore, port_id=fixed_ip.port_id)
105+
106+
107+
if __name__ == "__main__":
108+
asyncio.run(main())

0 commit comments

Comments
 (0)