#!/usr/bin/env python import datetime """ Main Flask RESTful API """ __author__ = "@tormakris" __copyright__ = "Copyright 2020, GoldenPogácsa Team" __module_name__ = "consumerlocator" __version__text__ = "1" class ConsumerLocator: def __init__(self): self.consumerList = [{"Host": "KnownHost", "State": True, "LastOk": datetime.datetime.now()}] self.currentConsumer = self.consumerList[0]["Host"] def learnConsumerList(self): """" Learns the list of consumers. """ recievedConsumerList = communicator.getConsumerList() for consumer in recievedConsumerList: self.consumerList.append({"Host": consumer, "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: if not communicator.ping(consumer["Host"]): 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) def updateConsumer(self): """ Checks all the consumers in the list and updates the current consumer if necessary. :return: the current consumer """ self.updateConsumerList() if not self.checkConsumer(): newCurrentConsumer = None for consumer in self.consumerList: if consumer["State"]: newCurrentConsumer = consumer break self.currentConsumer = newCurrentConsumer if self.currentConsumer is not None: return self.currentConsumer["Host"] else: return None def getCurrentConsumer(self): """ Returns the currently selected consumer. :return: the current consumer """ return self.currentConsumer["Host"] def checkConsumer(self): """ Check the consumers health. :return: True if OK, False if fail """ if communicator.ping(self.currentConsumer["Host"]): return True else: return False