Skip to content

Commit 3e608dc

Browse files
committed
add support for Metros
Signed-off-by: Marques Johansson <[email protected]>
1 parent 799ae83 commit 3e608dc

File tree

9 files changed

+79
-13
lines changed

9 files changed

+79
-13
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ manager = packet.Manager(auth_token="yourapiauthtoken")
8989

9090
device = manager.create_device(project_id='project-id',
9191
hostname='node-name-of-your-choice',
92-
plan='baremetal_1', facility='ewr1',
92+
plan='baremetal_1', metro='sv',
9393
operating_system='ubuntu_18_04')
9494
print(device)
9595
```

packet/Device.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def __init__(self, data, manager):
2828
self.customdata = data.get("customdata", None)
2929
self.operating_system = OperatingSystem(data["operating_system"])
3030
self.facility = data.get("facility")
31+
self.metro = data.get("metro")
3132
self.project = data.get("project")
3233
self.ssh_keys = data.get("ssh_keys")
3334
self.project_lite = data.get("project_lite")

packet/DeviceBatch.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ def __init__(self, data):
88
self.plan = data.get("plan")
99
self.operating_system = data.get("operating_system")
1010
self.facility = data.get("facility")
11+
self.metro = data.get("metro")
1112
self.quantity = data.get("quantity")
1213

1314
def __str__(self):

packet/IPAddress.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# SPDX-License-Identifier: LGPL-3.0-only
33

44
from .Facility import Facility
5+
from .Metro import Metro
56

67

78
class IPAddress:
@@ -23,6 +24,7 @@ def __init__(self, data, manager):
2324
self.project = data.get("project")
2425
self.project_lite = data.get("project_lite")
2526
self.facility = Facility(data.get("facility"))
27+
self.metro = Metro(data.get("metro"))
2628
self.details = data.get("details")
2729
self.assigned_to = data.get("assigned_to")
2830
self.interface = data.get("interface")

packet/Manager.py

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from .SSHKey import SSHKey
1111
from .Project import Project
1212
from .Facility import Facility
13+
from .Metro import Metro
1314
from .OperatingSystem import OperatingSystem
1415
from .Volume import Volume
1516
from .BGPConfig import BGPConfig
@@ -41,6 +42,14 @@ def list_facilities(self, params={}):
4142
facilities.append(facility)
4243
return facilities
4344

45+
def list_metros(self, params={}):
46+
data = self.call_api("metros", params=params)
47+
metros = list()
48+
for jsoned in data["metros"]:
49+
metro = Metro(jsoned)
50+
metros.append(metro)
51+
return metros
52+
4453
def list_plans(self, params={}):
4554
data = self.call_api("plans", params=params)
4655
plans = list()
@@ -121,8 +130,8 @@ def create_device(
121130
project_id,
122131
hostname,
123132
plan,
124-
facility,
125-
operating_system,
133+
facility="",
134+
operating_system="",
126135
always_pxe=False,
127136
billing_cycle="hourly",
128137
features={},
@@ -139,11 +148,11 @@ def create_device(
139148
hardware_reservation_id="",
140149
storage={},
141150
customdata={},
151+
metro="",
142152
):
143153

144154
params = {
145155
"billing_cycle": billing_cycle,
146-
"facility": facility,
147156
"features": features,
148157
"hostname": hostname,
149158
"locked": locked,
@@ -157,6 +166,10 @@ def create_device(
157166
"userdata": userdata,
158167
}
159168

169+
if metro != "":
170+
params["metro"] = metro
171+
if facility != "":
172+
params["facility"] = facility
160173
if hardware_reservation_id != "":
161174
params["hardware_reservation_id"] = hardware_reservation_id
162175
if storage:
@@ -319,6 +332,23 @@ def validate_capacity(self, servers):
319332
else:
320333
raise e
321334

335+
# servers is a list of tuples of metro, plan, and quantity.
336+
def validate_metro_capacity(self, servers):
337+
params = {"servers": []}
338+
for server in servers:
339+
params["servers"].append(
340+
{"facility": server[0], "plan": server[1], "quantity": server[2]}
341+
)
342+
343+
try:
344+
data = self.call_api("/capacity/metros", "POST", params)
345+
return all(s["available"] for s in data["servers"])
346+
except PacketError as e: # pragma: no cover
347+
if e.args[0] == "Error 503: Service Unavailable":
348+
return False
349+
else:
350+
raise e
351+
322352
def get_spot_market_prices(self, params={}):
323353
data = self.call_api("/market/spot/prices", params=params)
324354
return data["spot_market_prices"]
@@ -405,20 +435,24 @@ def reserve_ip_address(
405435
project_id,
406436
type,
407437
quantity,
408-
facility,
438+
facility="",
409439
details=None,
410440
comments=None,
411441
tags=list(),
442+
metro="",
412443
):
413444
request = {
414445
"type": type,
415446
"quantity": quantity,
416-
"facility": facility,
417447
"details": details,
418448
"comments": comments,
419449
"tags": tags,
420450
}
421451

452+
if facility != "":
453+
request["facility"] = facility
454+
if metro != "":
455+
request["metro"] = metro
422456
data = self.call_api(
423457
"/projects/%s/ips" % project_id, params=request, type="POST"
424458
)
@@ -575,15 +609,18 @@ def list_vlans(self, project_id, params=None):
575609
return vlans
576610

577611
def create_vlan(
578-
self, project_id, facility, vxlan=None, vlan=None, description=None
612+
self, project_id, facility="", vxlan=None, vlan=None, description=None, metro=""
579613
):
580614
params = {
581615
"project_id": project_id,
582-
"facility": facility,
583616
"vxlan": vxlan,
584617
"vlan": vlan,
585618
"description": description,
586619
}
620+
if facility != "":
621+
params["facility"] = facility
622+
if metro != "":
623+
params["metro"] = metro
587624
data = self.call_api(
588625
"projects/%s/virtual-networks" % project_id, type="POST", params=params
589626
)
@@ -638,14 +675,12 @@ def create_packet_connections(self, params):
638675
"project_id": params["project_id"],
639676
"provider_id": params["provider_id"],
640677
"provider_payload": params["provider_payload"],
641-
"facility": params["facility"],
642678
"port_speed": params["port_speed"],
643679
"vlan": params["vlan"],
644680
}
645-
if "tags" in params:
646-
body["tags"] = params["tags"]
647-
if "description" in params:
648-
body["description"] = params["description"]
681+
for opt in ["tags", "description", "facility", "metro"]:
682+
if opt in params:
683+
body[opt] = params[opt]
649684

650685
data = self.call_api("/packet-connect/connections", type="POST", params=body)
651686
return data

packet/Metro.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# -*- coding: utf-8 -*-
2+
# SPDX-License-Identifier: LGPL-3.0-only
3+
4+
5+
class Metro:
6+
def __init__(self, data):
7+
self.id = data.get("id")
8+
self.code = data.get("code")
9+
self.name = data.get("name")
10+
self.country = data.get("country")
11+
12+
def __str__(self):
13+
return "%s" % self.code
14+
15+
def __repr__(self):
16+
return "{}: {}".format(self.__class__.__name__, self.id)

packet/Vlan.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# SPDX-License-Identifier: LGPL-3.0-only
33
from packet import Project
44
from .Facility import Facility
5+
from .Metro import Metro
56

67

78
class Vlan:
@@ -15,9 +16,11 @@ def __init__(self, data, manager):
1516
self.vxlan = data.get("vxlan")
1617
self.internet_gateway = data.get("internet_gateway")
1718
self.facility_code = data.get("facility_code")
19+
self.metro_code = data.get("metro_code")
1820
self.created_at = data.get("created_at")
1921

2022
self.facility = Facility(data.get("facility"))
23+
self.metro = Metro(data.get("metro"))
2124
try:
2225
project_data = self.manager.call_api(
2326
data["assigned_to"]["href"], type="GET"

packet/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from .Email import Email # noqa
1414
from .Event import Event # noqa
1515
from .Facility import Facility # noqa
16+
from .Metro import Metro # noqa
1617
from .OperatingSystem import OperatingSystem # noqa
1718
from .Plan import Plan # noqa
1819
from .Project import Project # noqa

test/test_packet.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ def test_list_facilities(self):
2525
repr(facility)
2626
self.assertIsInstance(facility, packet.Facility)
2727

28+
def test_list_metros(self):
29+
metros = self.manager.list_metros()
30+
for metro in metros:
31+
str(metro)
32+
repr(metro)
33+
self.assertIsInstance(metro, packet.Metro)
34+
2835
def test_list_plans(self):
2936
plans = self.manager.list_plans()
3037
for plan in plans:

0 commit comments

Comments
 (0)