Skip to content

Commit 9e7b52c

Browse files
authored
new: Support deleting VLAN in networking group (#500)
* delete vlan * fix doc
1 parent 1e45b03 commit 9e7b52c

File tree

4 files changed

+109
-3
lines changed

4 files changed

+109
-3
lines changed

linode_api4/groups/networking.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,3 +367,30 @@ def transfer_prices(self, *filters):
367367
return self.client._get_and_filter(
368368
NetworkTransferPrice, *filters, endpoint="/network-transfer/prices"
369369
)
370+
371+
def delete_vlan(self, vlan, region):
372+
"""
373+
This operation deletes a VLAN.
374+
You can't delete a VLAN if it's still attached to a Linode.
375+
376+
API Documentation: https://techdocs.akamai.com/linode-api/reference/delete-vlan
377+
378+
:param vlan: The label of the VLAN to be deleted.
379+
:type vlan: str or VLAN
380+
:param region: The VLAN's region.
381+
:type region: str or Region
382+
"""
383+
if isinstance(region, Region):
384+
region = region.id
385+
386+
if isinstance(vlan, VLAN):
387+
vlan = vlan.label
388+
resp = self.client.delete(
389+
"/networking/vlans/{}/{}".format(region, vlan),
390+
model=self,
391+
)
392+
393+
if "error" in resp:
394+
return False
395+
396+
return True

test/integration/conftest.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,3 +502,22 @@ def pytest_configure(config):
502502
"markers",
503503
"smoke: mark test as part of smoke test suite",
504504
)
505+
506+
507+
@pytest.fixture(scope="session")
508+
def linode_for_vlan_tests(test_linode_client, e2e_test_firewall):
509+
client = test_linode_client
510+
region = get_region(client, {"Linodes", "Vlans"}, site_type="core")
511+
label = get_test_label(length=8)
512+
513+
linode_instance, password = client.linode.instance_create(
514+
"g6-nanode-1",
515+
region,
516+
image="linode/debian12",
517+
label=label,
518+
firewall=e2e_test_firewall,
519+
)
520+
521+
yield linode_instance
522+
523+
linode_instance.delete()

test/integration/models/networking/test_networking.py

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44
get_region,
55
get_token,
66
)
7-
from test.integration.helpers import get_test_label
7+
from test.integration.helpers import (
8+
get_test_label,
9+
retry_sending_request,
10+
wait_for_condition,
11+
)
812

913
import pytest
1014

11-
from linode_api4 import LinodeClient
15+
from linode_api4 import Instance, LinodeClient
1216
from linode_api4.objects import Config, ConfigInterfaceIPv4, Firewall, IPAddress
1317
from linode_api4.objects.networking import NetworkTransferPrice, Price
1418

@@ -163,3 +167,45 @@ def test_allocate_and_delete_ip(test_linode_client, create_linode):
163167
is_deleted = ip.delete()
164168

165169
assert is_deleted is True
170+
171+
172+
def get_status(linode: Instance, status: str):
173+
return linode.status == status
174+
175+
176+
def test_create_and_delete_vlan(test_linode_client, linode_for_vlan_tests):
177+
linode = linode_for_vlan_tests
178+
179+
config: Config = linode.configs[0]
180+
181+
config.interfaces = []
182+
config.save()
183+
184+
vlan_label = "testvlan"
185+
interface = config.interface_create_vlan(
186+
label=vlan_label, ipam_address="10.0.0.2/32"
187+
)
188+
189+
config.invalidate()
190+
191+
assert interface.id == config.interfaces[0].id
192+
assert interface.purpose == "vlan"
193+
assert interface.label == vlan_label
194+
195+
# Remove the VLAN interface and reboot Linode
196+
config.interfaces = []
197+
config.save()
198+
199+
wait_for_condition(3, 100, get_status, linode, "running")
200+
201+
retry_sending_request(3, linode.reboot)
202+
203+
wait_for_condition(3, 100, get_status, linode, "rebooting")
204+
assert linode.status == "rebooting"
205+
206+
# Delete the VLAN
207+
is_deleted = test_linode_client.networking.delete_vlan(
208+
vlan_label, linode.region
209+
)
210+
211+
assert is_deleted is True

test/unit/objects/networking_test.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from test.unit.base import ClientBaseCase
22

3-
from linode_api4 import ExplicitNullValue, Instance
3+
from linode_api4 import VLAN, ExplicitNullValue, Instance, Region
44
from linode_api4.objects import Firewall, IPAddress, IPv6Range
55

66

@@ -94,3 +94,17 @@ def test_delete_ip(self):
9494
ip.delete()
9595

9696
self.assertEqual(m.call_url, "/linode/instances/123/ips/127.0.0.1")
97+
98+
def test_delete_vlan(self):
99+
"""
100+
Tests that deleting a VLAN creates the correct api request
101+
"""
102+
with self.mock_delete() as m:
103+
self.client.networking.delete_vlan(
104+
VLAN(self.client, "vlan-test"),
105+
Region(self.client, "us-southeast"),
106+
)
107+
108+
self.assertEqual(
109+
m.call_url, "/networking/vlans/us-southeast/vlan-test"
110+
)

0 commit comments

Comments
 (0)