Skip to content

Commit fc5d5b0

Browse files
committed
python-sdk: Support regions/vpc-availability endpoints
1 parent f30ac54 commit fc5d5b0

File tree

7 files changed

+488
-6
lines changed

7 files changed

+488
-6
lines changed

linode_api4/groups/region.py

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from linode_api4.groups import Group
22
from linode_api4.objects import Region
3-
from linode_api4.objects.region import RegionAvailabilityEntry
3+
from linode_api4.objects.region import (
4+
RegionAvailabilityEntry,
5+
RegionVPCAvailability,
6+
)
47

58

69
class RegionGroup(Group):
@@ -43,3 +46,74 @@ def availability(self, *filters):
4346
return self.client._get_and_filter(
4447
RegionAvailabilityEntry, *filters, endpoint="/regions/availability"
4548
)
49+
50+
def availability_get(self, region_id):
51+
"""
52+
Returns availability data for a specific region.
53+
54+
API Documentation: https://techdocs.akamai.com/linode-api/reference/get-region-availability
55+
56+
:param region_id: The ID of the region to retrieve availability for.
57+
:type region_id: str
58+
59+
:returns: A list of availability entries for the specified region.
60+
:rtype: list of RegionAvailabilityEntry
61+
"""
62+
63+
result = self.client.get(f"/regions/{region_id}/availability")
64+
65+
if result is None:
66+
return []
67+
68+
return [RegionAvailabilityEntry.from_json(v) for v in result]
69+
70+
def vpc_availability(self, *filters):
71+
"""
72+
Returns VPC availability data for all regions.
73+
74+
NOTE: IPv6 VPCs may not currently be available to all users.
75+
76+
This endpoint supports pagination with the following parameters:
77+
- page: Page number (>= 1)
78+
- page_size: Number of items per page (25-500)
79+
80+
Pagination is handled automatically by PaginatedList. To configure page_size,
81+
set it when creating the LinodeClient:
82+
83+
client = LinodeClient(token, page_size=100)
84+
85+
API Documentation: https://techdocs.akamai.com/linode-api/reference/get-regions-vpc-availability
86+
87+
:param filters: Any number of filters to apply to this query.
88+
See :doc:`Filtering Collections</linode_api4/objects/filtering>`
89+
for more details on filtering.
90+
91+
:returns: A list of VPC availability data for regions.
92+
:rtype: PaginatedList of RegionVPCAvailability
93+
"""
94+
95+
return self.client._get_and_filter(
96+
RegionVPCAvailability, *filters, endpoint="/regions/vpc-availability"
97+
)
98+
99+
def vpc_availability_get(self, region_id):
100+
"""
101+
Returns VPC availability data for a specific region.
102+
103+
NOTE: IPv6 VPCs may not currently be available to all users.
104+
105+
API Documentation: https://techdocs.akamai.com/linode-api/reference/get-region-vpc-availability
106+
107+
:param region_id: The ID of the region to retrieve VPC availability for.
108+
:type region_id: str
109+
110+
:returns: VPC availability data for the specified region.
111+
:rtype: RegionVPCAvailability
112+
"""
113+
114+
result = self.client.get(f"/regions/{region_id}/vpc-availability")
115+
116+
if result is None:
117+
return None
118+
119+
return RegionVPCAvailability.from_json(result)

linode_api4/objects/region.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,29 @@ def availability(self) -> List["RegionAvailabilityEntry"]:
6363

6464
return [RegionAvailabilityEntry.from_json(v) for v in result]
6565

66+
@property
67+
def vpc_availability(self) -> "RegionVPCAvailability":
68+
"""
69+
Returns VPC availability data for this region.
70+
71+
NOTE: IPv6 VPCs may not currently be available to all users.
72+
73+
API Documentation: https://techdocs.akamai.com/linode-api/reference/get-region-vpc-availability
74+
75+
:returns: VPC availability data for this region.
76+
:rtype: RegionVPCAvailability
77+
"""
78+
result = self._client.get(
79+
f"{self.api_endpoint}/vpc-availability", model=self
80+
)
81+
82+
if result is None:
83+
raise UnexpectedResponseError(
84+
"Expected VPC availability data, got None."
85+
)
86+
87+
return RegionVPCAvailability.from_json(result)
88+
6689

6790
@dataclass
6891
class RegionAvailabilityEntry(JSONObject):
@@ -75,3 +98,18 @@ class RegionAvailabilityEntry(JSONObject):
7598
region: Optional[str] = None
7699
plan: Optional[str] = None
77100
available: bool = False
101+
102+
103+
@dataclass
104+
class RegionVPCAvailability(JSONObject):
105+
"""
106+
Represents the VPC availability data for a region.
107+
108+
API Documentation: https://techdocs.akamai.com/linode-api/reference/get-regions-vpc-availability
109+
110+
NOTE: IPv6 VPCs may not currently be available to all users.
111+
"""
112+
113+
region: Optional[str] = None
114+
available: bool = False
115+
available_ipv6_prefix_lengths: Optional[List[int]] = None
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"region": "us-east",
3+
"available": true,
4+
"available_ipv6_prefix_lengths": [52, 60]
5+
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
{
2+
"data": [
3+
{
4+
"region": "us-east",
5+
"available": true,
6+
"available_ipv6_prefix_lengths": [52, 48]
7+
},
8+
{
9+
"region": "us-west",
10+
"available": true,
11+
"available_ipv6_prefix_lengths": [56, 52, 48]
12+
},
13+
{
14+
"region": "nl-ams",
15+
"available": true,
16+
"available_ipv6_prefix_lengths": []
17+
},
18+
{
19+
"region": "us-ord",
20+
"available": true,
21+
"available_ipv6_prefix_lengths": []
22+
},
23+
{
24+
"region": "us-iad",
25+
"available": true,
26+
"available_ipv6_prefix_lengths": []
27+
},
28+
{
29+
"region": "fr-par",
30+
"available": true,
31+
"available_ipv6_prefix_lengths": []
32+
},
33+
{
34+
"region": "us-sea",
35+
"available": true,
36+
"available_ipv6_prefix_lengths": []
37+
},
38+
{
39+
"region": "br-gru",
40+
"available": true,
41+
"available_ipv6_prefix_lengths": []
42+
},
43+
{
44+
"region": "se-sto",
45+
"available": true,
46+
"available_ipv6_prefix_lengths": []
47+
},
48+
{
49+
"region": "es-mad",
50+
"available": true,
51+
"available_ipv6_prefix_lengths": []
52+
},
53+
{
54+
"region": "in-maa",
55+
"available": true,
56+
"available_ipv6_prefix_lengths": []
57+
},
58+
{
59+
"region": "jp-osa",
60+
"available": true,
61+
"available_ipv6_prefix_lengths": []
62+
},
63+
{
64+
"region": "it-mil",
65+
"available": true,
66+
"available_ipv6_prefix_lengths": []
67+
},
68+
{
69+
"region": "us-mia",
70+
"available": true,
71+
"available_ipv6_prefix_lengths": []
72+
},
73+
{
74+
"region": "id-cgk",
75+
"available": true,
76+
"available_ipv6_prefix_lengths": []
77+
},
78+
{
79+
"region": "us-lax",
80+
"available": true,
81+
"available_ipv6_prefix_lengths": []
82+
},
83+
{
84+
"region": "gb-lon",
85+
"available": true,
86+
"available_ipv6_prefix_lengths": []
87+
},
88+
{
89+
"region": "au-mel",
90+
"available": true,
91+
"available_ipv6_prefix_lengths": []
92+
},
93+
{
94+
"region": "in-bom-2",
95+
"available": true,
96+
"available_ipv6_prefix_lengths": []
97+
},
98+
{
99+
"region": "de-fra-2",
100+
"available": true,
101+
"available_ipv6_prefix_lengths": []
102+
},
103+
{
104+
"region": "sg-sin-2",
105+
"available": true,
106+
"available_ipv6_prefix_lengths": []
107+
},
108+
{
109+
"region": "jp-tyo-3",
110+
"available": true,
111+
"available_ipv6_prefix_lengths": []
112+
},
113+
{
114+
"region": "fr-par-2",
115+
"available": true,
116+
"available_ipv6_prefix_lengths": []
117+
},
118+
{
119+
"region": "ca-central",
120+
"available": false,
121+
"available_ipv6_prefix_lengths": []
122+
},
123+
{
124+
"region": "ap-southeast",
125+
"available": false,
126+
"available_ipv6_prefix_lengths": []
127+
}
128+
],
129+
"page": 1,
130+
"pages": 2,
131+
"results": 50
132+
}

0 commit comments

Comments
 (0)