6
6
7
7
import pytest
8
8
import requests
9
+ from requests .exceptions import ConnectionError , RequestException
9
10
10
11
from linode_api4 import ApiError , PlacementGroupAffinityType
11
12
from linode_api4 .linode_client import LinodeClient
@@ -68,14 +69,22 @@ def is_valid_ipv6(address):
68
69
except ipaddress .AddressValueError :
69
70
return False
70
71
71
- def get_public_ip (ip_version = "ipv4" ):
72
+ def get_public_ip (ip_version : str = "ipv4" , retries : int = 3 ):
72
73
url = (
73
74
f"https://api64.ipify.org?format=json"
74
75
if ip_version == "ipv6"
75
76
else f"https://api.ipify.org?format=json"
76
77
)
77
- response = requests .get (url )
78
- return str (response .json ()["ip" ])
78
+ for attempt in range (retries ):
79
+ try :
80
+ response = requests .get (url )
81
+ response .raise_for_status ()
82
+ return str (response .json ()["ip" ])
83
+ except (RequestException , ConnectionError ) as e :
84
+ if attempt < retries - 1 :
85
+ time .sleep (2 ) # Wait before retrying
86
+ else :
87
+ raise e
79
88
80
89
def create_inbound_rule (ipv4_address , ipv6_address ):
81
90
rule = [
@@ -94,12 +103,19 @@ def create_inbound_rule(ipv4_address, ipv6_address):
94
103
95
104
return rule
96
105
97
- # Fetch the public IP addresses
106
+ try :
107
+ ipv4_address = get_public_ip ("ipv4" )
108
+ except (RequestException , ConnectionError , ValueError , KeyError ):
109
+ ipv4_address = None
98
110
99
- ipv4_address = get_public_ip ("ipv4" )
100
- ipv6_address = get_public_ip ("ipv6" )
111
+ try :
112
+ ipv6_address = get_public_ip ("ipv6" )
113
+ except (RequestException , ConnectionError , ValueError , KeyError ):
114
+ ipv6_address = None
101
115
102
- inbound_rule = create_inbound_rule (ipv4_address , ipv6_address )
116
+ inbound_rule = []
117
+ if ipv4_address or ipv6_address :
118
+ inbound_rule = create_inbound_rule (ipv4_address , ipv6_address )
103
119
104
120
client = test_linode_client
105
121
0 commit comments