52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
import dns.resolver
|
|
import dns.query
|
|
from dns.exception import DNSException
|
|
import logging
|
|
|
|
|
|
# Resolve service from mesos-dns SRV record
|
|
# return dict {"servicename": [{"name": "service.f.q.d.n.", "port": 9999}]}
|
|
def resolve(app, conf):
|
|
hosts = {}
|
|
services = app['services']
|
|
domain = conf['domain']
|
|
group = None
|
|
|
|
if app['env'].get('SUROK_DISCOVERY_GROUP') is not None:
|
|
group = app['env']['SUROK_DISCOVERY_GROUP']
|
|
|
|
for service in services:
|
|
hosts[service['name']] = []
|
|
|
|
# Check group configuration
|
|
if group is not None:
|
|
pass
|
|
else:
|
|
# Load group from service config
|
|
# /etc/surok/conf.d/service_conf.json
|
|
group = service['group']
|
|
|
|
fqdn = '_' + service['name'] + '.' + group + '._tcp.' + domain
|
|
hosts[service['name']] = do_query(fqdn, conf['loglevel'])
|
|
|
|
return hosts
|
|
|
|
|
|
# Do SRV queries
|
|
# Return array: [{"name": "f.q.d.n", "port": 8876}]
|
|
def do_query(fqdn, loglevel):
|
|
servers = []
|
|
try:
|
|
query = dns.resolver.query(fqdn, 'SRV')
|
|
query.lifetime = 1.0
|
|
|
|
for rdata in query:
|
|
info = str(rdata).split()
|
|
server = {'name': info[3][:-1], 'port': info[2]}
|
|
servers.append(server)
|
|
except DNSException:
|
|
if loglevel != 'info':
|
|
logging.warning("Could not resolve " + fqdn)
|
|
|
|
return servers
|