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-11-11 21:13:40 +03:00
|
|
|
from .logger import info, warning, error, debug
|
2016-10-11 14:36:41 +03:00
|
|
|
import sys
|
2016-08-01 14:56:35 +03:00
|
|
|
|
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 16:15:45 +03:00
|
|
|
|
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:15:45 +03:00
|
|
|
|
2016-10-11 14:36:41 +03:00
|
|
|
group = get_group(service, app)
|
|
|
|
if group is False:
|
2016-11-11 21:13:40 +03:00
|
|
|
error('Group is not defined in config, SUROK_DISCOVERY_GROUP and MARATHON_APP_ID')
|
|
|
|
error('Not in Mesos launch?')
|
2016-10-11 14:36:41 +03:00
|
|
|
sys.exit(2)
|
2016-11-11 21:13:40 +03:00
|
|
|
|
2016-08-17 16:38:54 +03:00
|
|
|
# Port name from app config
|
2016-08-17 16:50:56 +03:00
|
|
|
ports = None
|
2016-08-17 16:38:54 +03:00
|
|
|
try:
|
2016-08-17 16:50:56 +03:00
|
|
|
ports = service['ports']
|
2016-08-17 16:38:54 +03:00
|
|
|
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-11-11 21:13:40 +03:00
|
|
|
else:
|
2016-08-17 16:38:54 +03:00
|
|
|
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:
|
2016-11-11 21:13:40 +03:00
|
|
|
resolver = dns.resolver.Resolver()
|
|
|
|
resolver.lifetime = 1
|
|
|
|
resolver.timeout = 1
|
|
|
|
query = resolver.query(fqdn, 'SRV')
|
2016-08-10 12:07:03 +03:00
|
|
|
|
|
|
|
for rdata in query:
|
|
|
|
info = str(rdata).split()
|
2016-08-12 10:39:50 +03:00
|
|
|
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-11-11 21:13:40 +03:00
|
|
|
error("Could not resolve " + fqdn + ': ' + str(e))
|
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
|
2016-10-11 14:36:41 +03:00
|
|
|
def get_group(service, app):
|
|
|
|
# Check group in app conf
|
|
|
|
if 'group' in service:
|
|
|
|
return service['group']
|
|
|
|
# Check environment variable
|
|
|
|
elif app['env'].get('SUROK_DISCOVERY_GROUP'):
|
|
|
|
return app['env']['SUROK_DISCOVERY_GROUP']
|
|
|
|
# Check marathon environment variable
|
|
|
|
elif app['env'].get('MARATHON_APP_ID'):
|
|
|
|
group = parse_marathon_app_id(app['env']['MARATHON_APP_ID'])
|
|
|
|
return group
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
# Parse MARATHON_APP_ID
|
2016-10-14 11:25:53 +03:00
|
|
|
# Return marathon.group
|
2016-10-11 14:36:41 +03:00
|
|
|
def parse_marathon_app_id(marathon_app_id):
|
|
|
|
marathon_app_id = marathon_app_id.split('/')
|
|
|
|
group = ''
|
|
|
|
counter = len(marathon_app_id) - 2
|
|
|
|
i = 0
|
|
|
|
while counter > i:
|
|
|
|
group = group + marathon_app_id[counter]
|
|
|
|
if counter != i + 1:
|
|
|
|
group += '.'
|
2016-11-11 21:13:40 +03:00
|
|
|
counter -= 1
|
2016-10-11 14:36:41 +03:00
|
|
|
|
|
|
|
return group
|