This repository has been archived on 2020-09-24. You can view files and clone it, but cannot push or open issues or pull requests.
producer/consumerlocator.py

98 lines
2.8 KiB
Python
Raw Normal View History

2020-03-29 15:27:36 +02:00
#!/usr/bin/env python
2020-03-29 16:38:40 +02:00
import datetime
import communicator
2020-03-29 15:27:36 +02:00
"""
2020-03-29 17:21:36 +02:00
Consumer locator modul, that manages the list of consumers.
2020-03-29 15:27:36 +02:00
"""
2020-03-29 17:21:36 +02:00
__author__ = "@dscharnitzky"
2020-03-29 15:27:36 +02:00
__copyright__ = "Copyright 2020, GoldenPogácsa Team"
__module_name__ = "consumerlocator"
__version__text__ = "1"
2020-03-29 15:54:52 +02:00
2020-03-29 15:26:01 +02:00
class ConsumerLocator:
2020-03-29 15:54:52 +02:00
2020-03-29 16:46:28 +02:00
"""
Manages the list of consumers.
"""
def __init__(self):
2020-03-29 16:46:28 +02:00
"""
Initialize class.
"""
2020-03-29 16:38:40 +02:00
self.consumerList = [{"Host": "KnownHost", "State": True, "LastOk": datetime.datetime.now()}]
self.currentConsumer = self.consumerList[0]["Host"]
def initCommunicator(self, comm: communicator.Communicator):
self.communicator = comm
2020-03-29 15:54:52 +02:00
def learnconsumerlist(self):
2020-03-29 15:54:52 +02:00
""""
Learns the list of consumers.
"""
recievedconsumerlist = self.communicator.discoveravailableconsumers()
if recievedconsumerlist is None:
return
for consumer in recievedconsumerlist:
2020-03-29 16:38:40 +02:00
self.consumerList.append({"Host": consumer, "State": True, "LastOk": datetime.datetime.now()})
self.updateConsumerList()
def updateconsumerlist(self):
2020-03-29 16:38:40 +02:00
"""
Updates the consumer list based on their availability.
"""
removeList = []
for consumer in self.consumerList:
if not self.communicator.checkconsumer(consumer["Host"]):
2020-03-29 16:38:40 +02:00
consumer["State"] = False
if datetime.datetime.now() - consumer["LastOk"] > datetime.timedelta(hours=1):
removeList.append(consumer)
else:
consumer["LastOk"] = datetime.datetime.now()
for rem in removeList:
self.consumerList.remove(rem)
2020-03-29 15:54:52 +02:00
def updateconsumer(self):
2020-03-29 15:54:52 +02:00
"""
2020-03-29 16:38:40 +02:00
Checks all the consumers in the list and updates the current consumer if necessary.
2020-03-29 16:46:28 +02:00
:return: the current consumer or None if there are no available customers at the moment.
2020-03-29 15:54:52 +02:00
"""
2020-03-29 16:38:40 +02:00
self.updateConsumerList()
if not self.checkConsumer():
newCurrentConsumer = None
for consumer in self.consumerList:
if consumer["State"]:
newCurrentConsumer = consumer
break
self.currentConsumer = newCurrentConsumer
self.learnconsumerlist()
2020-03-29 16:38:40 +02:00
if self.currentConsumer is not None:
return self.currentConsumer["Host"]
else:
return None
2020-03-29 15:54:52 +02:00
def getcurrentconsumer(self):
2020-03-29 15:54:52 +02:00
"""
Returns the currently selected consumer.
:return: the current consumer
"""
2020-03-29 16:38:40 +02:00
return self.currentConsumer["Host"]
2020-03-29 15:54:52 +02:00
def checkcurrentconsumer(self):
2020-03-29 15:54:52 +02:00
"""
Check the consumers health.
:return: True if OK, False if fail
"""
if self.communicator.checkconsumer(self.currentConsumer["Host"]):
2020-03-29 15:54:52 +02:00
return True
else:
return False