0538d9f479
start update for version changes hopefully fixed pesky stat bug move vpn detection into script plugin
89 lines
3.3 KiB
Python
89 lines
3.3 KiB
Python
from apscheduler.schedulers.background import BackgroundScheduler
|
|
from apscheduler.triggers.interval import IntervalTrigger
|
|
from master.context.history import History
|
|
|
|
from master.schema.instanceschema import InstanceSchema
|
|
|
|
import time
|
|
|
|
class Base():
|
|
def __init__(self):
|
|
self.history = History()
|
|
self.instance_list = {}
|
|
self.token_list = {}
|
|
self.scheduler = BackgroundScheduler()
|
|
self.scheduler.start()
|
|
self.scheduler.add_job(
|
|
func=self._remove_staleinstances,
|
|
trigger=IntervalTrigger(seconds=60),
|
|
id='stale_instance_remover',
|
|
name='Remove stale instances if no heartbeat in 60 seconds',
|
|
replace_existing=True
|
|
)
|
|
self.scheduler.add_job(
|
|
func=self._update_history_count,
|
|
trigger=IntervalTrigger(seconds=30),
|
|
id='update history',
|
|
name='update client and instance count every 30 seconds',
|
|
replace_existing=True
|
|
)
|
|
|
|
def _update_history_count(self):
|
|
servers = [instance.servers for instance in self.instance_list.values()]
|
|
servers = [inner for outer in servers for inner in outer]
|
|
client_num = 0
|
|
# force it being a number
|
|
for server in servers:
|
|
client_num += server.clientnum
|
|
self.history.add_client_history(client_num)
|
|
self.history.add_instance_history(len(self.instance_list))
|
|
self.history.add_server_history(len(servers))
|
|
|
|
def _remove_staleinstances(self):
|
|
for key, value in list(self.instance_list.items()):
|
|
if int(time.time()) - value.last_heartbeat > 60:
|
|
print('[_remove_staleinstances] removing stale instance {id}'.format(id=key))
|
|
del self.instance_list[key]
|
|
del self.token_list[key]
|
|
print('[_remove_staleinstances] {count} active instances'.format(count=len(self.instance_list.items())))
|
|
|
|
def get_instances(self):
|
|
return self.instance_list.values()
|
|
|
|
def get_instance_count(self):
|
|
return self.instance_list.count
|
|
|
|
def get_instance(self, id):
|
|
return self.instance_list[id]
|
|
|
|
def instance_exists(self, instance_id):
|
|
if instance_id in self.instance_list.keys():
|
|
return instance_id
|
|
else:
|
|
False
|
|
|
|
def add_instance(self, instance):
|
|
if instance.id in self.instance_list:
|
|
print('[add_instance] instance {id} already added, updating instead'.format(id=instance.id))
|
|
return self.update_instance(instance)
|
|
else:
|
|
print('[add_instance] adding instance {id}'.format(id=instance.id))
|
|
self.instance_list[instance.id] = instance
|
|
|
|
def update_instance(self, instance):
|
|
if instance.id not in self.instance_list:
|
|
print('[update_instance] instance {id} not added, adding instead'.format(id=instance.id))
|
|
return self.add_instance(instance)
|
|
else:
|
|
print('[update_instance] updating instance {id}'.format(id=instance.id))
|
|
self.instance_list[instance.id] = instance
|
|
|
|
def add_token(self, instance_id, token):
|
|
print('[add_token] adding {token} for id {id}'.format(token=token, id=instance_id))
|
|
self.token_list[instance_id] = token
|
|
|
|
def get_token(self, instance_id):
|
|
try:
|
|
return self.token_list[instance_id]
|
|
except KeyError:
|
|
return False |