@@ -390,6 +390,28 @@ def create_reserved_ip_assigned(test_linode_client, create_linode):
390390 reserved_ip .delete ()
391391
392392
393+ def verify_reserved_ip (reserved_ip ):
394+ assert isinstance (ipaddress .ip_address (reserved_ip .address ), ipaddress .IPv4Address )
395+ assert reserved_ip .type == "ipv4"
396+ assert reserved_ip .public == True
397+ assert reserved_ip .reserved == True
398+ assert reserved_ip .linode_id is None
399+ assert reserved_ip .assigned_entity is None
400+
401+
402+ def verify_reserved_ip_assigned (reserved_ip , resource ):
403+ assert isinstance (ipaddress .ip_address (reserved_ip .address ), ipaddress .IPv4Address )
404+ assert reserved_ip .type == "ipv4"
405+ assert reserved_ip .public == True
406+ assert reserved_ip .reserved == True
407+ assert reserved_ip .linode_id == resource .id
408+ assert reserved_ip .region .id == resource .region .id
409+ assert reserved_ip .assigned_entity .id == resource .id
410+ assert reserved_ip .assigned_entity .type == "linode"
411+ assert reserved_ip .assigned_entity .label == resource .label
412+ assert reserved_ip .assigned_entity .url == f"/v4/linode/instances/{ resource .id } "
413+
414+
393415@pytest .mark .smoke
394416@pytest .mark .parametrize ("region, tags" , [
395417 (TEST_REGION , ["test" ]),
@@ -401,16 +423,10 @@ def test_create_reserved_ip(request, test_linode_client, region, tags):
401423 region = region ,
402424 tags = tags
403425 )
404-
405426 request .addfinalizer (reserved_ip .delete )
406427
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
428+ verify_reserved_ip (reserved_ip )
412429 # assert reserved_ip.tags == tags # NOTE: Skipped as tags not available in the API yet
413- assert reserved_ip .assigned_entity is None
414430
415431
416432def test_create_reserved_ip_wo_region_fail (test_linode_client ):
@@ -430,23 +446,20 @@ def test_create_reserved_ip_wo_region_fail(test_linode_client):
430446@pytest .mark .skip # NOTE: Skipped as tags not available in the API yet
431447def test_update_reserved_ip_tags (create_reserved_ip ):
432448 reserved_ip = create_reserved_ip
449+ verify_reserved_ip (reserved_ip )
433450 assert reserved_ip .tags == ["test" ]
434451
435452 reserved_ip .save (tags = ["updated" ])
453+ verify_reserved_ip (reserved_ip )
436454 assert reserved_ip .tags == ["updated" ]
437455
438456
439457def test_create_reserved_ip_assigned (test_linode_client , create_reserved_ip_assigned ):
440458 client = test_linode_client
441459 linode , reserved_ip = create_reserved_ip_assigned
442460
443- assert reserved_ip . reserved == True
461+ verify_reserved_ip_assigned ( reserved_ip , linode )
444462 # 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 } "
450463
451464 ips_list = client .networking .ips ()
452465 assert reserved_ip .address in [ip .address for ip in ips_list ]
@@ -469,3 +482,61 @@ def test_create_reserved_ip_assigned(test_linode_client, create_reserved_ip_assi
469482 # linode_ips = linode.ips.ipv4.public
470483 # assert len(linode_ips) == 2
471484 # assert not any([ip.reserved for ip in linode_ips])
485+ # assert not any([ip.tags for ip in linode_ips]) # Tags should be removed ???
486+
487+
488+ def test_get_reserved_ip_types (test_linode_client , create_reserved_ip ):
489+ # TODO: Currently it uses client (token), should not it be publicly accessible (no token required) ???
490+ client = test_linode_client
491+ types = client .networking .reserved_ip_types ()
492+ assert types .only
493+
494+ pricing = types .first ()
495+ assert pricing .id == "reserved-ipv4"
496+ assert pricing .label == "Reserved IPv4"
497+ assert pricing .price .hourly
498+ # assert pricing.price.monthly is None
499+ # assert pricing.region_prices == []
500+
501+
502+ @pytest .mark .smoke
503+ @pytest .mark .parametrize ("reserved, region" , [
504+ (True , TEST_REGION ),
505+ (True , None ),
506+ ])
507+ def test_create_reserved_ip_with_allocate (test_linode_client , create_linode , reserved , region ):
508+ client = test_linode_client
509+ linode = create_linode
510+
511+ if region :
512+ reserved_ip = client .networking .ip_allocate (reserved = reserved , region = TEST_REGION )
513+ verify_reserved_ip (reserved_ip )
514+ else :
515+ reserved_ip = client .networking .ip_allocate (reserved = reserved , linode = linode .id )
516+ verify_reserved_ip_assigned (reserved_ip , linode )
517+
518+ # assert reserved_ip.tags == tags # NOTE: Skipped as tags not available in the API yet
519+
520+
521+ def test_create_reserved_ip_with_allocate_fail (test_linode_client , create_linode ):
522+ client = test_linode_client
523+ linode = create_linode
524+ region = TEST_REGION
525+
526+ while region == linode .region :
527+ region = get_region (
528+ LinodeClient (
529+ token = get_token (),
530+ base_url = get_api_url (),
531+ ca_path = get_api_ca_file (),
532+ ),
533+ {"Linodes" , "Cloud Firewall" },
534+ site_type = "core" ,
535+ )
536+
537+ with pytest .raises (ApiError ) as exc_info :
538+ client .networking .ip_allocate (reserved = True , region = region , linode = linode .id )
539+
540+ error_msg = str (exc_info .value .json )
541+ assert exc_info .value .status == 400
542+ assert "Region passed in must match Linode's region" in error_msg
0 commit comments