Skip to content

Commit 4e11963

Browse files
authored
Merge pull request #1686 from grycap/dydns
Fix EGI dns ops to work as default case
2 parents 3ca518f + d6c38ef commit 4e11963

File tree

2 files changed

+43
-35
lines changed

2 files changed

+43
-35
lines changed

IM/connectors/EGI.py

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -30,49 +30,49 @@ class EGICloudConnector(CloudConnector):
3030
DYDNS_URL = "https://nsupdate.fedcloud.eu"
3131
DEFAULT_TIMEOUT = 10
3232

33-
def _get_domains(self, token):
33+
@staticmethod
34+
def _get_domains(token):
3435
"""
3536
List the domains available in the DyDNS service
3637
"""
37-
url = f'{self.DYDNS_URL}/nic/domains'
38-
resp = requests.get(url, headers={'Authorization': f'Bearer {token}'}, timeout=self.DEFAULT_TIMEOUT)
38+
url = f'{EGICloudConnector.DYDNS_URL}/nic/domains'
39+
resp = requests.get(url, headers={'Authorization': f'Bearer {token}'},
40+
timeout=EGICloudConnector.DEFAULT_TIMEOUT)
3941
if resp.status_code != 200:
40-
self.log_error(f"Error getting domains: {resp.text}")
41-
return None
42+
return None, resp.text
4243
output = resp.json()
4344
if output.get("status") != "ok":
44-
self.log_error(f"Error getting domains: {output.get('message', 'Unknown error')}")
45-
return None
45+
return None, output.get('message', 'Unknown error')
4646
domains = []
4747
for domain in output.get("private", []) + output.get("public", []):
4848
if domain.get("available"):
4949
domains.append(domain["name"])
50-
return domains
50+
return domains, ""
5151

52-
def _get_host(self, hostname, domain, token):
52+
@staticmethod
53+
def _get_host(hostname, domain, token):
5354
"""
5455
Look for a host registered in the DyDNS service
5556
"""
5657
if hostname == "*":
5758
parts = domain.split(".")
5859
domain = ".".join(parts[1:])
5960
hostname = parts[0]
60-
url = f'{self.DYDNS_URL}/nic/hosts?domain={domain}'
61-
resp = requests.get(url, headers={'Authorization': f'Bearer {token}'}, timeout=self.DEFAULT_TIMEOUT)
61+
url = f'{EGICloudConnector.DYDNS_URL}/nic/hosts?domain={domain}'
62+
resp = requests.get(url, headers={'Authorization': f'Bearer {token}'},
63+
timeout=EGICloudConnector.DEFAULT_TIMEOUT)
6264
if resp.status_code != 200:
63-
self.log_error(f"Error getting host {hostname}.{domain}: {resp.text}")
64-
return None
65+
return None, resp.text
6566

6667
output = resp.json()
6768
if output.get("status") != "ok":
68-
self.log_error(f"Error getting host {hostname}.{domain}: {output.get('message', 'Unknown error')}")
69-
return None
69+
return None, output.get('message', 'Unknown error')
7070

7171
for host in output.get("hosts", []):
7272
if host.get("name") == hostname:
73-
return host
73+
return host, ""
7474

75-
return None
75+
return None, ""
7676

7777
def add_dns_entry(self, hostname, domain, ip, auth_data, extra_args=None):
7878
"""
@@ -85,7 +85,9 @@ def add_dns_entry(self, hostname, domain, ip, auth_data, extra_args=None):
8585
self.log_debug(f"Registering DNS entry {hostname}.{domain} with DyDNS oauth token")
8686
token = im_auth[0].get("token")
8787
# Check if the host already exists
88-
host = self._get_host(hostname, domain, token)
88+
host, error = EGICloudConnector._get_host(hostname, domain, token)
89+
if error:
90+
self.log_error(f"Error getting host {hostname}.{domain}: {error}")
8991
if host:
9092
self.log_debug(f"DNS entry {hostname}.{domain} already exists")
9193
if ip in [host.get("ipv4"), host.get("ipv6")]:
@@ -94,9 +96,10 @@ def add_dns_entry(self, hostname, domain, ip, auth_data, extra_args=None):
9496
else:
9597
commennt = 'IM created DNS entry'
9698
if hostname == "*":
97-
url = f'{self.DYDNS_URL}/nic/register?fqdn={domain}&comment={commennt}&wildcard=true'
99+
url = (f'{EGICloudConnector.DYDNS_URL}/nic/register?fqdn=' +
100+
f'{domain}&comment={commennt}&wildcard=true')
98101
else:
99-
url = f'{self.DYDNS_URL}/nic/register?fqdn={hostname}.{domain}&comment={commennt}'
102+
url = f'{EGICloudConnector.DYDNS_URL}/nic/register?fqdn={hostname}.{domain}&comment={commennt}'
100103
resp = requests.get(url, headers={'Authorization': f'Bearer {token}'}, timeout=self.DEFAULT_TIMEOUT)
101104
if resp.status_code != 200:
102105
self.log_error(f"Error registering DNS entry {hostname}.{domain}: {resp.text}")
@@ -126,8 +129,8 @@ def add_dns_entry(self, hostname, domain, ip, auth_data, extra_args=None):
126129
fqdn = f'{hostname}.{domain}'
127130
if hostname == "*":
128131
fqdn = domain
129-
url = f'{self.DYDNS_URL}/nic/update?hostname={fqdn}&myip={ip}'
130-
resp = requests.get(url, headers=headers, timeout=self.DEFAULT_TIMEOUT)
132+
url = f'{EGICloudConnector.DYDNS_URL}/nic/update?hostname={fqdn}&myip={ip}'
133+
resp = requests.get(url, headers=headers, timeout=EGICloudConnector.DEFAULT_TIMEOUT)
131134
if resp.status_code != 200:
132135
self.log_error(f"Error updating DNS entry {hostname}.{domain}: {resp.text}")
133136
return False
@@ -146,21 +149,26 @@ def del_dns_entry(self, hostname, domain, ip, auth_data, extra_args=None):
146149
self.log_debug(f"Deleting DNS entry {hostname}.{domain} with DyDNS oauth token")
147150
token = im_auth[0].get("token")
148151

149-
domains = self._get_domains(token)
152+
domains, error = EGICloudConnector._get_domains(token)
153+
if error:
154+
self.log_error(f"Error getting domains: {error}")
150155
if domain not in domains:
151156
self.log_debug(f"Domain {domain} not found in DyDNS service")
152157
return False
153158

154-
host = self._get_host(hostname, domain, token)
159+
host, error = EGICloudConnector._get_host(hostname, domain, token)
160+
if error:
161+
self.log_error(f"Error getting host {hostname}.{domain}: {error}")
155162
if not host:
156163
self.log_debug(f"DNS entry {hostname}.{domain} does not exist. Do not need to delete.")
157164
return True
158165

159166
if hostname == "*":
160-
url = f'{self.DYDNS_URL}/nic/unregister?fqdn={domain}'
167+
url = f'{EGICloudConnector.DYDNS_URL}/nic/unregister?fqdn={domain}'
161168
else:
162-
url = f'{self.DYDNS_URL}/nic/unregister?fqdn={hostname}.{domain}'
163-
resp = requests.get(url, headers={'Authorization': f'Bearer {token}'}, timeout=self.DEFAULT_TIMEOUT)
169+
url = f'{EGICloudConnector.DYDNS_URL}/nic/unregister?fqdn={hostname}.{domain}'
170+
resp = requests.get(url, headers={'Authorization': f'Bearer {token}'},
171+
timeout=EGICloudConnector.DEFAULT_TIMEOUT)
164172
if resp.status_code != 200:
165173
self.log_error(f"Error deleting DNS entry {hostname}.{domain}: {resp.text}")
166174
return False

test/unit/connectors/EGI.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class TestEGIConnector(unittest.TestCase):
3333
@patch('requests.get')
3434
@patch('IM.connectors.EGI.EGICloudConnector._get_host')
3535
def test_add_dns(self, mock_get_host, mock_get):
36-
mock_get_host.return_value = None
36+
mock_get_host.return_value = None, ""
3737
mock_get.return_value = MagicMock(status_code=200, json=lambda: {"status": "ok",
3838
"host": {"update_secret": "123"}})
3939
auth_data = Authentication([{'type': 'InfrastructureManager', 'token': 'access_token'}])
@@ -50,7 +50,7 @@ def test_add_dns(self, mock_get_host, mock_get):
5050
@patch('requests.get')
5151
@patch('IM.connectors.EGI.EGICloudConnector._get_host')
5252
def test_add_dydns(self, mock_get_host, mock_get):
53-
mock_get_host.return_value = None
53+
mock_get_host.return_value = None, ""
5454
mock_get.return_value = MagicMock(status_code=200, json=lambda: {"status": "ok",
5555
"host": {"update_secret": "123"}})
5656
cloud = EGICloudConnector(None, None)
@@ -65,8 +65,8 @@ def test_add_dydns(self, mock_get_host, mock_get):
6565
@patch('IM.connectors.EGI.EGICloudConnector._get_host')
6666
@patch('IM.connectors.EGI.EGICloudConnector._get_domains')
6767
def test_del_dns(self, mock_get_domains, mock_get_host, mock_get):
68-
mock_get_host.return_value = {"name": "hostname"}
69-
mock_get_domains.return_value = ["domain"]
68+
mock_get_host.return_value = {"name": "hostname"}, ""
69+
mock_get_domains.return_value = ["domain"], ""
7070
mock_get.return_value = MagicMock(status_code=200, json=lambda: {"status": "ok"})
7171
auth_data = Authentication([{'type': 'InfrastructureManager', 'token': 'access_token'}])
7272
cloud = EGICloudConnector(None, None)
@@ -79,9 +79,9 @@ def test_del_dns(self, mock_get_domains, mock_get_host, mock_get):
7979
def test_get_host(self, mock_get):
8080
mock_get.return_value = MagicMock(status_code=200, json=lambda: {"status": "ok",
8181
"hosts": [{"name": "hostname"}]})
82-
cloud = EGICloudConnector(None, None)
83-
host = EGICloudConnector._get_host(cloud, "hostname", "domain", "access_token")
82+
host, error = EGICloudConnector._get_host("hostname", "domain", "access_token")
8483
self.assertEqual(host["name"], "hostname")
84+
self.assertEqual(error, "")
8585
self.assertEqual(mock_get.call_count, 1)
8686
eurl = f"{EGICloudConnector.DYDNS_URL}/nic/hosts?domain=domain"
8787
mock_get.assert_called_with(eurl, headers={'Authorization': 'Bearer access_token'}, timeout=10)
@@ -93,8 +93,8 @@ def test_get_domains(self, mock_get):
9393
"available": True}],
9494
"public": [{"name": "domain2",
9595
"available": True}]})
96-
cloud = EGICloudConnector(None, None)
97-
domains = EGICloudConnector._get_domains(cloud, "access_token")
96+
domains, error = EGICloudConnector._get_domains("access_token")
97+
self.assertEqual(error, "")
9898
self.assertEqual(domains, ["domain1", "domain2"])
9999
self.assertEqual(mock_get.call_count, 1)
100100
eurl = f"{EGICloudConnector.DYDNS_URL}/nic/domains"

0 commit comments

Comments
 (0)