Communicator API impementation #1
46
app.py
46
app.py
@ -1,12 +1,15 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
import random
|
||||||
|
import uuid
|
||||||
|
import logging
|
||||||
import sentry_sdk
|
import sentry_sdk
|
||||||
import communicator
|
|
||||||
import consumerlocator
|
|
||||||
import messagesender
|
|
||||||
import time
|
import time
|
||||||
|
from communicator import Communicator
|
||||||
|
from consumerlocator import ConsumerLocator
|
||||||
|
from messagesender import MessageSender
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Main Flask RESTful API
|
Main entrypoint
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__author__ = "@tormakris"
|
__author__ = "@tormakris"
|
||||||
@ -15,29 +18,18 @@ __module_name__ = "app"
|
|||||||
__version__text__ = "1"
|
__version__text__ = "1"
|
||||||
|
|
||||||
sentry_sdk.init("https://3fa5ae886ba1489092ad49a93cb419c1@sentry.kmlabz.com/9")
|
sentry_sdk.init("https://3fa5ae886ba1489092ad49a93cb419c1@sentry.kmlabz.com/9")
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print("Producer: init")
|
LOGGER.info("Producer started")
|
||||||
comm = communicator.Communicator()
|
generateduuid = str(uuid)
|
||||||
conslist = consumerlocator.ConsumerLocator()
|
LOGGER.debug(f"My uuid is {generateduuid}")
|
||||||
conslist.initcommunicator(comm)
|
consumerlocator = ConsumerLocator()
|
||||||
message = messagesender.MessageSender()
|
communicator = Communicator(consumerlocator=consumerlocator,uuid=uuid)
|
||||||
|
messagesender = MessageSender(communicator=communicator)
|
||||||
|
|
||||||
conslist.learnconsumerlist()
|
while True:
|
||||||
print("Producer: started sending")
|
LOGGER.info("Sending message to consumer")
|
||||||
for i in range(30):
|
messagesender.sendmessage()
|
||||||
msg = message.createMessage(20)
|
time.sleep(random.random())
|
||||||
print("Producer: trying to send ", i, "th message: ", msg)
|
|
||||||
available = False
|
|
||||||
if conslist.updateconsumer() is None:
|
|
||||||
print("Producer: no consumer available (waiting a bit)")
|
|
||||||
time.sleep(1)
|
|
||||||
else:
|
|
||||||
available = True
|
|
||||||
if available:
|
|
||||||
comm.sendmessage(msg)
|
|
||||||
print("Producer: message sent")
|
|
||||||
else:
|
|
||||||
print("Producer: failed to send message")
|
|
||||||
|
|
||||||
print("Producer: finished")
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
import logging
|
||||||
import random
|
import random
|
||||||
import requests
|
import requests
|
||||||
from singleton import Singleton
|
from consumerlocator import ConsumerLocator
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Communicator module
|
Communicator module
|
||||||
@ -13,32 +13,54 @@ __copyright__ = "Copyright 2020, GoldenPogácsa Team"
|
|||||||
__module_name__ = "messagesender"
|
__module_name__ = "messagesender"
|
||||||
__version__text__ = "1"
|
__version__text__ = "1"
|
||||||
|
|
||||||
class Communicator(Singleton):
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
class Communicator:
|
||||||
"""
|
"""
|
||||||
Class handling low level communication with consumers.
|
Class handling low level communication with consumers.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def __init__(self, consumerlocator: ConsumerLocator, uuid):
|
||||||
|
"""
|
||||||
|
Initialize object
|
||||||
|
:param consumerlocator:
|
||||||
|
:param uuid:
|
||||||
|
"""
|
||||||
|
self.consumerlocator=consumerlocator
|
||||||
|
self.uuid = uuid
|
||||||
|
|
||||||
def sendmessage(self, message: str) -> None:
|
def sendmessage(self, message: str) -> None:
|
||||||
"""
|
"""
|
||||||
Send message to consumer.
|
Send message to consumer.
|
||||||
:param message:
|
:param message:
|
||||||
:return: none
|
:return: none
|
||||||
"""
|
"""
|
||||||
return None
|
currentconsumer=self.consumerlocator.getcurrentconsumer()
|
||||||
|
LOGGER.debug(f"Sending message to {currentconsumer}")
|
||||||
|
requests.post(f'http://{currentconsumer}/log', json={'uuid': self.uuid, 'message': message})
|
||||||
|
|
||||||
def discoveravailableconsumers(self) -> list:
|
def discoveravailableconsumers(self) -> list:
|
||||||
"""
|
"""
|
||||||
Get the list of available consumer from the current primary consumer.
|
Get the list of available consumer from the current primary consumer.
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
return ["10.69.42.1","10.42.69.1","10.10.10.10","10.6.66.1"]
|
currentconsumer = self.consumerlocator.getcurrentconsumer()
|
||||||
|
response = requests.get(f'http://{currentconsumer}/consumer')
|
||||||
|
json = response.json()
|
||||||
|
LOGGER.debug(f"List of currently available consumers: {json}")
|
||||||
|
return json
|
||||||
|
|
||||||
def isconsumeravailable(self) -> bool:
|
def isconsumeravailable(self) -> bool:
|
||||||
"""
|
"""
|
||||||
Readiness probe primary consumer.
|
Readiness probe primary consumer.
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
return bool(random.getrandbits(1))
|
currentconsumer = self.consumerlocator.getcurrentconsumer()
|
||||||
|
response = requests.get(f'http://{currentconsumer}/consumer')
|
||||||
|
isavailable = response.status_code == 200
|
||||||
|
LOGGER.debug(f"Current consumer availability: {isavailable}")
|
||||||
|
return isavailable
|
||||||
|
|
||||||
def checkconsumer(self, consumer: str) -> bool:
|
def checkconsumer(self, consumer: str) -> bool:
|
||||||
"""
|
"""
|
||||||
@ -46,4 +68,7 @@ class Communicator(Singleton):
|
|||||||
:param consumer:
|
:param consumer:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
return bool(random.getrandbits(1))
|
response = requests.get(f'http://{consumer}/consumer')
|
||||||
|
isavailable = response.status_code == 200
|
||||||
|
LOGGER.debug(f"Consumer {consumer} availability: {isavailable}")
|
||||||
|
return isavailable
|
||||||
|
@ -1,48 +1,46 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
import logging
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
|
from communicator import Communicator
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Main Flask RESTful API
|
Message sender component
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__author__ = "@tormakris"
|
__author__ = "@kovacsbence"
|
||||||
__copyright__ = "Copyright 2020, GoldenPogácsa Team"
|
__copyright__ = "Copyright 2020, GoldenPogácsa Team"
|
||||||
__module_name__ = "messagesender"
|
__module_name__ = "messagesender"
|
||||||
__version__text__ = "1"
|
__version__text__ = "1"
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class MessageSender:
|
class MessageSender:
|
||||||
"""
|
"""
|
||||||
Üzenetek küldéséért felelős komponens.
|
Üzenetek küldéséért felelős komponens.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, communicator: Communicator):
|
||||||
"""
|
"""
|
||||||
Inicializálja az osztályt.
|
Inicializálja az osztályt.
|
||||||
"""
|
"""
|
||||||
pass
|
self.communicator = communicator
|
||||||
|
|
||||||
|
def randomstring(self, stringLength) -> str:
|
||||||
def randomString(self, stringLength):
|
|
||||||
"""Generate a random string of fixed length """
|
"""Generate a random string of fixed length """
|
||||||
letters = string.ascii_lowercase
|
letters = string.ascii_lowercase
|
||||||
return ''.join(random.choice(letters) for i in range(stringLength))
|
return ''.join(random.choice(letters) for i in range(stringLength))
|
||||||
|
|
||||||
|
def sendmessage(self, message: str = "") -> None:
|
||||||
def createMessage(self, p) -> str:
|
|
||||||
"""
|
"""
|
||||||
Ez egy metodus
|
Uzenet letrehozasa
|
||||||
:param szam:
|
:param message:
|
||||||
:param szoveg:
|
|
||||||
:return: str tipus
|
:return: str tipus
|
||||||
"""
|
"""
|
||||||
data = self.randomString(p)
|
if not message:
|
||||||
|
data = self.randomstring(32)
|
||||||
return str(data)
|
else:
|
||||||
pass
|
data = message
|
||||||
|
self.communicator.sendmessage(data)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
temp = MessageSender()
|
|
||||||
print(temp.createMessage(20))
|
|
||||||
|
30
singleton.py
30
singleton.py
@ -1,30 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
"""
|
|
||||||
Singleton meta module
|
|
||||||
"""
|
|
||||||
|
|
||||||
__author__ = "@tormakris"
|
|
||||||
__copyright__ = "Copyright 2020, GoldenPogácsa Team"
|
|
||||||
__module_name__ = "singleton"
|
|
||||||
__version__text__ = "1"
|
|
||||||
|
|
||||||
|
|
||||||
class Singleton(object):
|
|
||||||
"""
|
|
||||||
Singleton metaclass
|
|
||||||
"""
|
|
||||||
_instances = {}
|
|
||||||
|
|
||||||
def __new__(class_, *args, **kwargs):
|
|
||||||
"""
|
|
||||||
New
|
|
||||||
:param args:
|
|
||||||
:param kwargs:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
if class_ not in class_._instances:
|
|
||||||
class_._instances[class_] = super(
|
|
||||||
Singleton, class_).__new__(
|
|
||||||
class_, *args, **kwargs)
|
|
||||||
return class_._instances[class_]
|
|
Reference in New Issue
Block a user