|
1 | 1 | import copy |
2 | 2 | import ipaddress |
| 3 | +from test.integration.helpers import get_test_label |
3 | 4 |
|
4 | 5 | import pytest |
5 | 6 |
|
6 | 7 | from linode_api4 import ( |
7 | 8 | ApiError, |
8 | 9 | Instance, |
| 10 | + InterfaceGeneration, |
9 | 11 | LinodeInterface, |
10 | 12 | LinodeInterfaceDefaultRouteOptions, |
| 13 | + LinodeInterfaceOptions, |
11 | 14 | LinodeInterfacePublicIPv4AddressOptions, |
12 | 15 | LinodeInterfacePublicIPv4Options, |
13 | 16 | LinodeInterfacePublicIPv6Options, |
|
18 | 21 | LinodeInterfaceVPCIPv4Options, |
19 | 22 | LinodeInterfaceVPCIPv4RangeOptions, |
20 | 23 | LinodeInterfaceVPCOptions, |
| 24 | + ReservedIPAddress, |
21 | 25 | ) |
22 | 26 |
|
23 | 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 | + ) |
| 44 | + |
| 45 | + |
| 46 | +def create_linode_with_legacy_config(client, ip_address, label, firewall): |
| 47 | + linode, _ = client.linode.instance_create( |
| 48 | + "g6-nanode-1", |
| 49 | + ip_address.region, |
| 50 | + image="linode/debian12", |
| 51 | + label=label, |
| 52 | + firewall=firewall, |
| 53 | + interface_generation=InterfaceGeneration.LEGACY_CONFIG, |
| 54 | + ipv4=[ip_address.address], |
| 55 | + ) |
| 56 | + return linode |
| 57 | + |
| 58 | + |
| 59 | +def create_linode_with_standard_interfaces(client, ip_address, label, firewall): |
| 60 | + interface = build_interface_public_ipv4(firewall.id, ip_address.address) |
| 61 | + linode, _ = client.linode.instance_create( |
| 62 | + "g6-nanode-1", |
| 63 | + ip_address.region, |
| 64 | + image="linode/debian12", |
| 65 | + label=label, |
| 66 | + interface_generation=InterfaceGeneration.LINODE, |
| 67 | + interfaces=[interface], |
| 68 | + ) |
| 69 | + return linode |
| 70 | + |
| 71 | + |
24 | 72 | def test_linode_create_with_linode_interfaces( |
25 | 73 | create_vpc_with_subnet, |
26 | 74 | linode_with_linode_interfaces, |
@@ -359,3 +407,42 @@ def test_linode_interface_firewalls(e2e_test_firewall, linode_interface_public): |
359 | 407 | firewall = firewalls[0] |
360 | 408 | assert firewall.id == e2e_test_firewall.id |
361 | 409 | assert firewall.label == e2e_test_firewall.label |
| 410 | + |
| 411 | + |
| 412 | +@pytest.mark.parametrize( |
| 413 | + "create_linode_fn", |
| 414 | + [create_linode_with_legacy_config, create_linode_with_standard_interfaces], |
| 415 | + ids=["legacy_config", "standard_interfaces"], |
| 416 | +) |
| 417 | +def test_linode_interfaces_with_reserved_ips( |
| 418 | + test_linode_client, e2e_test_firewall, create_reserved_ip, create_linode_fn |
| 419 | +): |
| 420 | + client = test_linode_client |
| 421 | + reserved_ip = create_reserved_ip |
| 422 | + label = get_test_label(length=8) |
| 423 | + |
| 424 | + linode = create_linode_fn(client, reserved_ip, label, e2e_test_firewall) |
| 425 | + |
| 426 | + try: |
| 427 | + linode_ips = linode.ips.ipv4.public |
| 428 | + assert len(linode_ips) == 1 |
| 429 | + assert linode_ips[0].address == reserved_ip.address |
| 430 | + assert linode_ips[0].reserved == True |
| 431 | + assert linode_ips[0].linode_id == linode.id |
| 432 | + assert linode_ips[0].assigned_entity.id == linode.id |
| 433 | + assert linode_ips[0].assigned_entity.type == "linode" |
| 434 | + assert linode_ips[0].assigned_entity.label == linode.label |
| 435 | + assert ( |
| 436 | + linode_ips[0].assigned_entity.url |
| 437 | + == f"/v4/linode/instances/{linode.id}" |
| 438 | + ) |
| 439 | + finally: |
| 440 | + linode.delete() |
| 441 | + |
| 442 | + reserved_ips_list = client.networking.reserved_ips( |
| 443 | + ReservedIPAddress.address == reserved_ip.address |
| 444 | + ) |
| 445 | + assert len(reserved_ips_list) == 1 |
| 446 | + assert reserved_ips_list[0].reserved == True |
| 447 | + assert reserved_ips_list[0].linode_id is None |
| 448 | + assert reserved_ips_list[0].assigned_entity is None |
0 commit comments