|
| 1 | +import ipaddress |
1 | 2 | import time |
2 | 3 | from test.integration.conftest import ( |
3 | 4 | get_api_ca_file, |
|
13 | 14 |
|
14 | 15 | import pytest |
15 | 16 |
|
16 | | -from linode_api4 import Instance, LinodeClient |
17 | | -from linode_api4.objects import Config, ConfigInterfaceIPv4, Firewall, IPAddress |
| 17 | +from linode_api4 import Instance, LinodeClient, ApiError |
| 18 | +from linode_api4.objects import Config, ConfigInterfaceIPv4, Firewall, IPAddress, ReservedIPAddress |
18 | 19 | from linode_api4.objects.networking import ( |
19 | 20 | FirewallCreateDevicesOptions, |
20 | 21 | NetworkTransferPrice, |
@@ -351,3 +352,120 @@ def test_ip_info(test_linode_client, create_linode): |
351 | 352 | assert ip_info.subnet_mask is not None |
352 | 353 | assert ip_info.type == "ipv4" |
353 | 354 | assert ip_info.vpc_nat_1_1 is None |
| 355 | + |
| 356 | + |
| 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 | + reserved_ip.delete() |
| 368 | + |
| 369 | + |
| 370 | +@pytest.fixture |
| 371 | +def create_reserved_ip_assigned(test_linode_client, create_linode): |
| 372 | + client = test_linode_client |
| 373 | + linode = create_linode |
| 374 | + reserved_ip = client.networking.reserved_ip_create( |
| 375 | + region=linode.region, |
| 376 | + tags=["test", "assigned"], |
| 377 | + ) |
| 378 | + |
| 379 | + client.networking.ip_addresses_assign( |
| 380 | + assignments=[{"address": reserved_ip.address, "linode_id": linode.id}], |
| 381 | + region=linode.region, |
| 382 | + ) |
| 383 | + |
| 384 | + reserved_ip = test_linode_client.load(ReservedIPAddress, reserved_ip.address) |
| 385 | + |
| 386 | + yield linode, reserved_ip |
| 387 | + |
| 388 | + # Delete only if IP exists (some tests delete it earlier) |
| 389 | + if reserved_ip.address in [ip.address for ip in client.networking.reserved_ips()]: |
| 390 | + reserved_ip.delete() |
| 391 | + |
| 392 | + |
| 393 | +@pytest.mark.smoke |
| 394 | +@pytest.mark.parametrize("region, tags", [ |
| 395 | + (TEST_REGION, ["test"]), |
| 396 | + (TEST_REGION, None), |
| 397 | +]) |
| 398 | +def test_create_reserved_ip(request, test_linode_client, region, tags): |
| 399 | + client = test_linode_client |
| 400 | + reserved_ip = client.networking.reserved_ip_create( |
| 401 | + region=region, |
| 402 | + tags=tags |
| 403 | + ) |
| 404 | + |
| 405 | + request.addfinalizer(reserved_ip.delete) |
| 406 | + |
| 407 | + assert isinstance(ipaddress.ip_address(reserved_ip.address), ipaddress.IPv4Address) |
| 408 | + assert reserved_ip.type == "ipv4" |
| 409 | + assert reserved_ip.public == True |
| 410 | + assert reserved_ip.linode_id is None |
| 411 | + assert reserved_ip.reserved == True |
| 412 | + # assert reserved_ip.tags == tags # NOTE: Skipped as tags not available in the API yet |
| 413 | + assert reserved_ip.assigned_entity is None |
| 414 | + |
| 415 | + |
| 416 | +def test_create_reserved_ip_wo_region_fail(test_linode_client): |
| 417 | + client = test_linode_client |
| 418 | + |
| 419 | + with pytest.raises(ApiError) as exc_info: |
| 420 | + client.networking.reserved_ip_create( |
| 421 | + region=None, |
| 422 | + tags=["test"] |
| 423 | + ) |
| 424 | + |
| 425 | + error_msg = str(exc_info.value.json) |
| 426 | + assert exc_info.value.status == 400 |
| 427 | + assert "region is required" in error_msg |
| 428 | + |
| 429 | + |
| 430 | +@pytest.mark.skip # NOTE: Skipped as tags not available in the API yet |
| 431 | +def test_update_reserved_ip_tags(create_reserved_ip): |
| 432 | + reserved_ip = create_reserved_ip |
| 433 | + assert reserved_ip.tags == ["test"] |
| 434 | + |
| 435 | + reserved_ip.save(tags=["updated"]) |
| 436 | + assert reserved_ip.tags == ["updated"] |
| 437 | + |
| 438 | + |
| 439 | +def test_create_reserved_ip_assigned(test_linode_client, create_reserved_ip_assigned): |
| 440 | + client = test_linode_client |
| 441 | + linode, reserved_ip = create_reserved_ip_assigned |
| 442 | + |
| 443 | + assert reserved_ip.reserved == True |
| 444 | + # assert reserved_ip.tags == tags # NOTE: Skipped as tags not available in the API yet |
| 445 | + assert reserved_ip.linode_id == linode.id |
| 446 | + assert reserved_ip.assigned_entity.id == linode.id |
| 447 | + assert reserved_ip.assigned_entity.type == "linode" |
| 448 | + assert reserved_ip.assigned_entity.label == linode.label |
| 449 | + assert reserved_ip.assigned_entity.url == f"/v4/linode/instances/{linode.id}" |
| 450 | + |
| 451 | + ips_list = client.networking.ips() |
| 452 | + assert reserved_ip.address in [ip.address for ip in ips_list] |
| 453 | + |
| 454 | + reserved_ips_list = client.networking.reserved_ips() |
| 455 | + assert reserved_ip.address in [ip.address for ip in reserved_ips_list] |
| 456 | + |
| 457 | + # linode_ips = linode.ips.ipv4.public |
| 458 | + # assert len(linode_ips) == 2 |
| 459 | + # assert any([ip.reserved for ip in linode_ips]) |
| 460 | + |
| 461 | + reserved_ip.delete() |
| 462 | + reserved_ips_list = client.networking.reserved_ips() |
| 463 | + assert reserved_ip.address not in [ip.address for ip in reserved_ips_list] |
| 464 | + |
| 465 | + reserved_ips_list = client.networking.reserved_ips(ReservedIPAddress.address==reserved_ip.address) |
| 466 | + assert len(reserved_ips_list) == 0 |
| 467 | + |
| 468 | + # delattr(linode, "_ips") |
| 469 | + # linode_ips = linode.ips.ipv4.public |
| 470 | + # assert len(linode_ips) == 2 |
| 471 | + # assert not any([ip.reserved for ip in linode_ips]) |
0 commit comments