surok/surok/discovery.py

80 lines
2.2 KiB
Python
Raw Normal View History

2016-08-01 14:56:35 +03:00
import dns.resolver
2016-08-10 11:55:18 +03:00
import dns.query
from dns.exception import DNSException
2016-08-17 12:13:02 +03:00
import logging
2016-08-01 14:56:35 +03:00
2016-08-09 15:23:32 +03:00
2016-10-05 14:16:51 +03:00
# Configure logging
FORMAT = '%(asctime) %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger('discovery')
2016-08-09 15:23:32 +03:00
# Resolve service from mesos-dns SRV record
2016-08-10 11:55:18 +03:00
# return dict {"servicename": [{"name": "service.f.q.d.n.", "port": 9999}]}
2016-08-01 14:56:35 +03:00
def resolve(app, conf):
2016-08-03 09:54:09 +03:00
hosts = {}
2016-08-02 19:02:25 +03:00
services = app['services']
2016-08-01 14:56:35 +03:00
domain = conf['domain']
2016-08-09 15:44:23 +03:00
group = None
# Groups hack
if app['env'].get('SUROK_DISCOVERY_GROUP') is not None:
group = app['env']['SUROK_DISCOVERY_GROUP']
2016-08-02 19:02:25 +03:00
for service in services:
2016-08-17 17:16:43 +03:00
hosts[service['name']] = {}
2016-08-09 16:34:52 +03:00
# Check group configuration
if group is not None:
pass
2016-08-09 15:44:23 +03:00
else:
2016-08-09 16:34:52 +03:00
# Load group from service config
# /etc/surok/conf.d/service_conf.json
2016-08-09 15:44:23 +03:00
group = service['group']
# Port name from app config
2016-08-17 16:50:56 +03:00
ports = None
try:
2016-08-17 16:50:56 +03:00
ports = service['ports']
except:
pass
# This is fast fix for port naming
# Will be rewrite later
fqdn = ''
2016-08-17 16:50:56 +03:00
if ports is not None:
for port_name in ports:
fqdn = '_' + port_name + '.' + '_' + service['name'] + '.' + group + '._tcp.' + domain
2016-08-17 17:16:43 +03:00
hosts[service['name']][port_name] = do_query(fqdn, conf['loglevel'])
2016-10-11 12:17:58 +03:00
else:
fqdn = '_' + service['name'] + '.' + group + '._tcp.' + domain
2016-08-17 16:50:56 +03:00
hosts[service['name']] = do_query(fqdn, conf['loglevel'])
2016-08-01 14:56:35 +03:00
return hosts
2016-08-10 12:07:03 +03:00
# Do SRV queries
# Return array: [{"name": "f.q.d.n", "port": 8876}]
2016-08-17 12:13:02 +03:00
def do_query(fqdn, loglevel):
2016-08-10 12:07:03 +03:00
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]}
2016-08-10 12:07:03 +03:00
servers.append(server)
2016-10-05 13:14:12 +03:00
except DNSException as e:
2016-08-17 12:13:02 +03:00
if loglevel != 'info':
2016-10-05 14:16:51 +03:00
logger.error("Could not resolve " + fqdn + ': ' + str(e))
2016-10-05 11:46:51 +03:00
return {"state": 404}
2016-08-10 12:07:03 +03:00
return servers
2016-10-11 12:14:34 +03:00
# Groups switch
# Priority: config, environment, marathon environment
def get_group(conf):
pass