surok/surok/system.py

145 lines
4.2 KiB
Python
Raw Normal View History

2016-08-01 15:24:13 +03:00
import os
2016-10-14 11:50:16 +03:00
import sys
2016-10-14 11:25:53 +03:00
import requests
from .discovery import Discovery
from .logger import Logger
logger=Logger()
2016-08-01 16:09:07 +03:00
2016-08-17 12:13:02 +03:00
# Get old configuration
2016-08-01 16:09:07 +03:00
def get_old(name, service_conf):
try:
path = '/var/tmp/surok.' + name
f = open(path, 'r')
old = f.read()
f.close()
except Exception as e:
logger.error(str(e))
2016-08-01 16:09:07 +03:00
return 0
if old == service_conf:
return 1
else:
return 0
2016-08-17 12:13:02 +03:00
2016-08-01 16:09:07 +03:00
2016-11-06 22:24:26 +03:00
# Get old discovered servers from memcache
2016-11-06 23:03:39 +03:00
def get_old_from_memcache(mc, name, app_hosts):
2016-11-06 22:24:26 +03:00
mc_servers_key = 'surok_' + name + '_servers'
2016-11-06 23:03:39 +03:00
new_servers = []
2016-11-06 22:24:26 +03:00
old_servers = mc.get(mc_servers_key)
2016-11-06 23:03:39 +03:00
for service in app_hosts:
for server in app_hosts[service]:
new_servers.append(server['name'] + ':' + server['port'])
for server in new_servers:
if server not in old_servers:
write_confs_to_memcache(mc, new_servers, mc_servers_key)
return 0
return 1
# Write to memcache
def write_confs_to_memcache(mc, servers, key):
mc.set(key, servers)
2016-11-06 22:24:26 +03:00
2016-08-01 16:09:07 +03:00
def write_lock(name, service_conf):
path = '/var/tmp/surok.' + name
f = open(path, 'w')
2016-08-01 15:24:13 +03:00
f.write(service_conf)
f.close()
2016-08-01 16:09:07 +03:00
def do_reload(service_conf, app_conf):
logger.warning('Write new configuration of ' + app_conf['conf_name'])
2016-08-01 16:09:07 +03:00
f = open(app_conf['dest'], 'w')
f.write(service_conf)
f.close()
2016-08-01 16:09:07 +03:00
write_lock(app_conf['conf_name'], service_conf)
2016-08-01 16:09:07 +03:00
# Reload conf
stdout = os.popen(app_conf['reload_cmd']).read()
return stdout
2016-11-10 17:22:49 +03:00
# Discovery memcached servers
def discovery_memcached(conf):
discovery=Discovery()
2016-11-10 17:22:49 +03:00
memcache = conf['memcached']
app_conf = {
"services": [
{
"name": memcache['discovery']['service'],
"group": memcache['discovery']['group']
}
]
}
hosts = discovery.resolve(app_conf)
2016-11-10 17:22:49 +03:00
mc_servers = []
for server in hosts[memcache['discovery']['service']]:
mc_server = server['name'] + ':' + server['port']
mc_servers.append(mc_server)
return mc_servers
2016-11-06 23:03:39 +03:00
# !!! NEED REFACTORING !!!
2016-11-06 22:24:26 +03:00
def reload_conf(service_conf, app_conf, conf, app_hosts):
2016-10-14 11:25:53 +03:00
# Check marathon enabled in configuration
if (conf.get('version','0.7')=='0.8' and conf['marathon'].get('restart',False)) or (
conf.get('version','0.7')=='0.7' and conf['marathon'].get('enable',False)):
2016-11-06 23:03:39 +03:00
if get_old(app_conf['conf_name'], service_conf) != 1:
restart_self_in_marathon(conf['marathon'])
2016-11-06 22:24:26 +03:00
# Check memcache
# Need rewriting
################
if 'memcached' in conf:
if conf['memcached']['enabled'] is True:
2016-11-11 09:51:25 +03:00
import memcache
2016-11-06 22:24:26 +03:00
# Check old servers
2016-11-10 17:22:49 +03:00
mc_hosts = None
2016-11-06 22:24:26 +03:00
if conf['memcached']['discovery']['enabled'] is True:
2016-11-10 17:22:49 +03:00
mc_hosts = discovery_memcached(conf)
logger.info('Discovered memcached hosts: ' + str(mc_hosts))
2016-11-10 17:22:49 +03:00
else:
mc_hosts = conf['memcached']['hosts']
2016-11-09 15:31:57 +03:00
try:
2016-11-10 17:22:49 +03:00
mc = memcache.Client(mc_hosts)
if get_old_from_memcache(mc, app_conf['conf_name'], app_hosts) != 1:
2016-11-09 15:31:57 +03:00
stdout = do_reload(service_conf, app_conf)
logger.info(stdout)
2016-11-09 15:31:57 +03:00
return True
except Exception as e:
logger.error('Cannot connect to memcached: ' + str(e))
2016-11-09 15:31:57 +03:00
2016-11-06 22:24:26 +03:00
else:
logger.warning('DEPRECATED main conf file. Please use new syntax!')
2016-11-09 15:31:57 +03:00
# End of memcache block
#######################
if get_old(app_conf['conf_name'], service_conf) != 1:
stdout = do_reload(service_conf, app_conf)
logger.info(stdout)
2016-11-06 23:03:39 +03:00
return True
2016-08-01 16:09:07 +03:00
else:
logger.debug('Same config ' + app_conf['conf_name'] + ' Skip reload')
2016-11-06 23:03:39 +03:00
return False
2016-10-14 11:25:53 +03:00
# Do POST request to marathon API
# /v2/apps//app/name/restart
def restart_self_in_marathon(marathon):
# Check MARATHON_APP_ID environment varible
if not os.environ.get('MARATHON_APP_ID',False):
logger.error('Cannot find MARATHON_APP_ID. Not in Mesos?')
2016-10-14 11:25:53 +03:00
sys.exit(2)
# Ok. In this step we made restart request to Marathon
r = requests.post('http://'+marathon['host']+'/v2/apps/'+os.environ['MARATHON_APP_ID']+'/restart',
data={'force': marathon.get('force',False)})