Communicator API impementation #1

Closed
tormakris wants to merge 4 commits from master into dev-communicator
2 changed files with 41 additions and 30 deletions

4
app.py
View File

@ -1,14 +1,13 @@
#!/usr/bin/env python
import random
import time
import uuid
import logging
import sentry_sdk
import time
from communicator import Communicator
from consumerlocator import ConsumerLocator
from messagesender import MessageSender
"""
Main entrypoint
"""
@ -19,7 +18,6 @@ __module_name__ = "app"
__version__text__ = "1"
sentry_sdk.init("https://3fa5ae886ba1489092ad49a93cb419c1@sentry.kmlabz.com/9")
logging.basicConfig(level=logging.INFO)
LOGGER = logging.getLogger(__name__)

View File

@ -2,9 +2,10 @@
import datetime
import communicator
import os
"""
Consumer locator modul, that manages the list of consumers.
Consumer locator module, that manages the list of consumers.
"""
__author__ = "@dscharnitzky"
@ -23,10 +24,15 @@ class ConsumerLocator:
"""
Initialize class.
"""
self.consumerList = [{"Host": "KnownHost", "State": True, "LastOk": datetime.datetime.now()}]
self.currentConsumer = self.consumerList[0]["Host"]
os.environ["KnownConsumer"] = "10.69.42.2" # TODO remove
self.consumerlist = [{"Host": os.environ["KnownConsumer"], "State": True, "LastOk": datetime.datetime.now()}]
self.currentconsumer = self.consumerlist[0]
def initCommunicator(self, comm: communicator.Communicator):
def initcommunicator(self, comm: communicator.Communicator):
"""
Initialize the reference to the communicator
:param comm: is the communicator
"""
self.communicator = comm
def learnconsumerlist(self):
@ -36,46 +42,54 @@ class ConsumerLocator:
recievedconsumerlist = self.communicator.discoveravailableconsumers()
if recievedconsumerlist is None:
return
for consumer in recievedconsumerlist:
self.consumerList.append({"Host": consumer, "State": True, "LastOk": datetime.datetime.now()})
self.updateConsumerList()
for recconsumer in recievedconsumerlist:
contains = False
for consumer in self.consumerlist:
if consumer["Host"] == recconsumer:
contains = True
if not contains:
self.consumerlist.append({"Host": recconsumer, "State": True, "LastOk": datetime.datetime.now()})
self.updateconsumerlist()
def updateconsumerlist(self):
"""
Updates the consumer list based on their availability.
"""
removeList = []
for consumer in self.consumerList:
removelist = []
for consumer in self.consumerlist:
if not self.communicator.checkconsumer(consumer["Host"]):
consumer["State"] = False
if datetime.datetime.now() - consumer["LastOk"] > datetime.timedelta(hours=1):
removeList.append(consumer)
removelist.append(consumer)
else:
consumer["LastOk"] = datetime.datetime.now()
for rem in removeList:
self.consumerList.remove(rem)
consumer["State"] = True
for rem in removelist:
self.consumerlist.remove(rem)
def updateconsumer(self):
"""
Checks all the consumers in the list and updates the current consumer if necessary.
If the current consumer is not available, checks all the consumers in the list and updates the current one.
:return: the current consumer or None if there are no available customers at the moment.
"""
self.updateConsumerList()
if not self.checkConsumer():
if not self.checkcurrentconsumer():
self.updateconsumerlist()
newcurrentconsumer = None
newCurrentConsumer = None
for consumer in self.consumerList:
for consumer in self.consumerlist:
if consumer["State"]:
newCurrentConsumer = consumer
newcurrentconsumer = consumer
break
self.currentConsumer = newCurrentConsumer
self.learnconsumerlist()
self.currentconsumer = newcurrentconsumer
if self.currentconsumer is not None:
self.learnconsumerlist()
if self.currentConsumer is not None:
return self.currentConsumer["Host"]
if self.currentconsumer is not None:
return self.currentconsumer["Host"]
else:
return None
@ -84,14 +98,13 @@ class ConsumerLocator:
Returns the currently selected consumer.
:return: the current consumer
"""
return self.currentConsumer["Host"]
return self.currentconsumer["Host"]
def checkcurrentconsumer(self):
"""
Check the consumers health.
:return: True if OK, False if fail
"""
if self.communicator.checkconsumer(self.currentConsumer["Host"]):
return True
else:
if self.currentconsumer is None:
return False
return self.communicator.checkconsumer(self.currentconsumer["Host"])