Skip to content

Commit 3961d4b

Browse files
committed
Create int tests for Reserved IPs: linode interfaces
1 parent bd24819 commit 3961d4b

3 files changed

Lines changed: 113 additions & 73 deletions

File tree

test/integration/models/linode/interfaces/test_interfaces.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
Instance,
99
LinodeInterface,
1010
LinodeInterfaceDefaultRouteOptions,
11+
InterfaceGeneration,
12+
LinodeInterfaceOptions,
1113
LinodeInterfacePublicIPv4AddressOptions,
1214
LinodeInterfacePublicIPv4Options,
1315
LinodeInterfacePublicIPv6Options,
@@ -18,7 +20,27 @@
1820
LinodeInterfaceVPCIPv4Options,
1921
LinodeInterfaceVPCIPv4RangeOptions,
2022
LinodeInterfaceVPCOptions,
23+
ReservedIPAddress,
2124
)
25+
from test.integration.helpers import get_test_label
26+
27+
28+
def build_interface_public_ipv4(firewall, ip_address):
29+
return LinodeInterfaceOptions(
30+
firewall_id=firewall,
31+
default_route=LinodeInterfaceDefaultRouteOptions(
32+
ipv4=True,
33+
),
34+
public=LinodeInterfacePublicOptions(
35+
ipv4=LinodeInterfacePublicIPv4Options(
36+
addresses=[
37+
LinodeInterfacePublicIPv4AddressOptions(
38+
address=ip_address, primary=True
39+
)
40+
],
41+
),
42+
),
43+
)
2244

2345

2446
def test_linode_create_with_linode_interfaces(
@@ -359,3 +381,51 @@ def test_linode_interface_firewalls(e2e_test_firewall, linode_interface_public):
359381
firewall = firewalls[0]
360382
assert firewall.id == e2e_test_firewall.id
361383
assert firewall.label == e2e_test_firewall.label
384+
385+
386+
@pytest.mark.parametrize("iface_type", [
387+
InterfaceGeneration.LEGACY_CONFIG,
388+
InterfaceGeneration.LINODE
389+
])
390+
def test_linode_interfaces_with_reserved_ips(test_linode_client, e2e_test_firewall, create_reserved_ip, iface_type):
391+
client = test_linode_client
392+
reserved_ip = create_reserved_ip
393+
label = get_test_label(length=8)
394+
395+
if iface_type == InterfaceGeneration.LEGACY_CONFIG:
396+
linode, _ = client.linode.instance_create(
397+
"g6-nanode-1",
398+
reserved_ip.region,
399+
image="linode/debian12",
400+
label=label,
401+
firewall=e2e_test_firewall,
402+
interface_generation=iface_type,
403+
ipv4=[reserved_ip.address]
404+
)
405+
else:
406+
interface = build_interface_public_ipv4(e2e_test_firewall.id, reserved_ip.address)
407+
linode, _ = client.linode.instance_create(
408+
"g6-nanode-1",
409+
reserved_ip.region,
410+
image="linode/debian12",
411+
label=label,
412+
interface_generation=iface_type,
413+
interfaces=[interface],
414+
)
415+
416+
linode_ips = linode.ips.ipv4.public
417+
assert len(linode_ips) == 1
418+
assert linode_ips[0].address == reserved_ip.address
419+
assert linode_ips[0].reserved == True
420+
assert linode_ips[0].linode_id == linode.id
421+
assert linode_ips[0].assigned_entity.id == linode.id
422+
assert linode_ips[0].assigned_entity.type == "linode"
423+
assert linode_ips[0].assigned_entity.label == linode.label
424+
assert linode_ips[0].assigned_entity.url == f"/v4/linode/instances/{linode.id}"
425+
426+
linode.delete()
427+
reserved_ips_list = client.networking.reserved_ips(ReservedIPAddress.address==reserved_ip.address)
428+
assert len(reserved_ips_list) == 1
429+
assert reserved_ips_list[0].reserved == True
430+
assert reserved_ips_list[0].linode_id is None
431+
assert reserved_ips_list[0].assigned_entity is None

test/integration/models/linode/test_linode.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
Instance,
2020
InterfaceGeneration,
2121
LinodeInterface,
22+
ReservedIPAddress,
2223
Type,
2324
)
2425
from linode_api4.objects.linode import InstanceDiskEncryptionType, MigrationType
@@ -1147,3 +1148,39 @@ def test_update_linode_maintenance_policy(create_linode, test_linode_client):
11471148
linode.invalidate()
11481149
assert result
11491150
assert linode.maintenance_policy_id == non_default_policy.slug
1151+
1152+
1153+
def test_update_linode_with_reserved_ip_in_address(test_linode_client, e2e_test_firewall, create_reserved_ip):
1154+
label = get_test_label(length=8)
1155+
client = test_linode_client
1156+
reserved_ip = create_reserved_ip
1157+
assert reserved_ip.reserved == True
1158+
assert reserved_ip.linode_id is None
1159+
assert reserved_ip.assigned_entity is None
1160+
1161+
linode, _ = client.linode.instance_create(
1162+
"g6-nanode-1",
1163+
reserved_ip.region,
1164+
image="linode/debian12",
1165+
label=label,
1166+
firewall=e2e_test_firewall,
1167+
)
1168+
1169+
linode_ips = linode.ips.ipv4.public
1170+
assert len(linode_ips) == 1
1171+
assert linode_ips[0].address != reserved_ip.address
1172+
1173+
linode.ip_allocate(True, reserved_ip.address)
1174+
delattr(linode, "_ips")
1175+
linode_ips = linode.ips.ipv4.public
1176+
assert len(linode_ips) == 2
1177+
assert reserved_ip.address in [ip.address for ip in linode_ips]
1178+
1179+
reserved_ip = client.networking.reserved_ips(ReservedIPAddress.address==reserved_ip.address)[0]
1180+
assert reserved_ip.linode_id == linode.id
1181+
assert reserved_ip.assigned_entity.id == linode.id
1182+
assert reserved_ip.assigned_entity.type == "linode"
1183+
assert reserved_ip.assigned_entity.label == linode.label
1184+
assert reserved_ip.assigned_entity.url == f"/v4/linode/instances/{linode.id}"
1185+
1186+
linode.delete()

test/integration/models/networking/test_networking.py

Lines changed: 6 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@
1414

1515
import pytest
1616

17-
from linode_api4 import Instance, LinodeClient, ApiError
18-
from linode_api4.objects import Config, ConfigInterfaceIPv4, Firewall, InterfaceGeneration, IPAddress, ReservedIPAddress
17+
from linode_api4 import (
18+
Instance,
19+
LinodeClient,
20+
ApiError,
21+
)
22+
from linode_api4.objects import Config, ConfigInterfaceIPv4, Firewall, IPAddress, ReservedIPAddress
1923
from linode_api4.objects.networking import (
2024
FirewallCreateDevicesOptions,
2125
NetworkTransferPrice,
@@ -354,44 +358,6 @@ def test_ip_info(test_linode_client, create_linode):
354358
assert ip_info.vpc_nat_1_1 is None
355359

356360

357-
@pytest.fixture
358-
def create_reserved_ip(test_linode_client):
359-
client = test_linode_client
360-
reserved_ip = client.networking.reserved_ip_create(
361-
region=TEST_REGION,
362-
tags=["test1"]
363-
)
364-
365-
yield reserved_ip
366-
367-
# Delete only if IP exists (some tests delete it earlier)
368-
if client.networking.reserved_ips(ReservedIPAddress.address==reserved_ip.address):
369-
reserved_ip.delete()
370-
371-
372-
@pytest.fixture
373-
def create_reserved_ip_assigned(test_linode_client, create_linode):
374-
client = test_linode_client
375-
linode = create_linode
376-
reserved_ip = client.networking.reserved_ip_create(
377-
region=linode.region,
378-
tags=["test", "assigned"],
379-
)
380-
381-
client.networking.ip_addresses_assign(
382-
assignments=[{"address": reserved_ip.address, "linode_id": linode.id}],
383-
region=linode.region,
384-
)
385-
386-
reserved_ip = test_linode_client.load(ReservedIPAddress, reserved_ip.address)
387-
388-
yield linode, reserved_ip
389-
390-
# Delete only if IP exists (some tests delete it earlier)
391-
if client.networking.reserved_ips(ReservedIPAddress.address==reserved_ip.address):
392-
reserved_ip.delete()
393-
394-
395361
def verify_reserved_ip(reserved_ip):
396362
assert isinstance(ipaddress.ip_address(reserved_ip.address), ipaddress.IPv4Address)
397363
assert reserved_ip.type == "ipv4"
@@ -580,36 +546,3 @@ def test_convert_unassigned_reserved_ip_to_ephemeral(test_linode_client, create_
580546

581547
reserved_ips_list = client.networking.reserved_ips(ReservedIPAddress.address==reserved_ip.address)
582548
assert len(reserved_ips_list) == 0
583-
584-
585-
# TODO: move to linode's tests file
586-
@pytest.mark.parametrize("interface", [
587-
InterfaceGeneration.LEGACY_CONFIG,
588-
# InterfaceGeneration.LINODE
589-
])
590-
def test_create_linode_with_reserved_ip_in_legacy_config(test_linode_client, e2e_test_firewall, create_reserved_ip, interface):
591-
client = test_linode_client
592-
reserved_ip = create_reserved_ip
593-
label = get_test_label(length=8)
594-
595-
# if interface == InterfaceGeneration.LINODE:
596-
# interface = "POST /v4beta/linode/instances: [400] ipv4: Reserved IPs must be assigned directly in interface configurations when using Linode Interfaces"
597-
598-
linode, _ = client.linode.instance_create(
599-
"g6-nanode-1",
600-
TEST_REGION,
601-
image="linode/debian12",
602-
label=label,
603-
firewall=e2e_test_firewall,
604-
interface_generation=interface,
605-
ipv4=[reserved_ip.address]
606-
)
607-
608-
linode_ips = linode.ips.ipv4.public
609-
assert len(linode_ips) == 1
610-
verify_reserved_ip_assigned(linode_ips[0], linode)
611-
612-
linode.delete()
613-
reserved_ips_list = client.networking.reserved_ips(ReservedIPAddress.address==reserved_ip.address)
614-
assert len(reserved_ips_list) == 1
615-
verify_reserved_ip(reserved_ips_list[0])

0 commit comments

Comments
 (0)