forked from kytos/kytos
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #438 from kytos-ng/feat/event_buffer_config
Add in configuration for event buffers
- Loading branch information
Showing
9 changed files
with
608 additions
and
92 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
"""Module for kytos buffers""" | ||
|
||
from .buffers import KytosEventBuffer | ||
from .manager import KytosBuffers |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
"""Utilities for composing KytosEventBuffers""" | ||
|
||
from janus import PriorityQueue, Queue | ||
|
||
from kytos.core.helpers import get_thread_pool_max_workers | ||
|
||
from .buffers import KytosEventBuffer | ||
|
||
queue_classes = { | ||
'queue': Queue, | ||
'priority': PriorityQueue, | ||
} | ||
|
||
|
||
def process_queue(config: dict) -> Queue: | ||
""" | ||
Create a janus queue from a given config dict | ||
""" | ||
queue_type = queue_classes[config.get('type', 'queue')] | ||
queue_size = config.get('maxsize', 0) | ||
if isinstance(queue_size, str): | ||
if queue_size.startswith('threadpool_'): | ||
threadpool = queue_size[len('threadpool_'):] | ||
queue_size = get_thread_pool_max_workers().get(threadpool, 0) | ||
else: | ||
raise TypeError( | ||
'Expected int or str formatted ' | ||
'as "threadpool_{threadpool_name}"' | ||
) | ||
return queue_type(maxsize=queue_size) | ||
|
||
|
||
extension_processors = {} | ||
|
||
|
||
def buffer_from_config(name: str, config: dict) -> KytosEventBuffer: | ||
""" | ||
Create a KytosEventBuffer from a given config dict | ||
""" | ||
buffer_cls = KytosEventBuffer | ||
args = {} | ||
# Process Queue Config | ||
args['queue'] = process_queue(config.get('queue', {})) | ||
|
||
buffer = buffer_cls(name, **args) | ||
|
||
# Process Mixins | ||
extensions: dict = config.get('extensions', []) | ||
for extension in extensions: | ||
extension_type = extension['type'] | ||
extension_args = extension.get('args', {}) | ||
buffer = extension_processors[extension_type](buffer, extension_args) | ||
|
||
return buffer |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
"""Kytos Buffer Classes, based on Python Queue.""" | ||
import logging | ||
|
||
from janus import PriorityQueue, Queue | ||
|
||
from kytos.core.config import KytosConfig | ||
from kytos.core.events import KytosEvent | ||
from kytos.core.helpers import get_thread_pool_max_workers | ||
|
||
from .buffers import KytosEventBuffer | ||
from .factory import buffer_from_config | ||
|
||
LOG = logging.getLogger(__name__) | ||
|
||
|
||
class KytosBuffers: | ||
"""Set of KytosEventBuffer used in Kytos.""" | ||
|
||
def __init__(self): | ||
"""Build four KytosEventBuffers. | ||
:attr:`conn`: :class:`~kytos.core.buffers.KytosEventBuffer` with events | ||
received from connection events. | ||
:attr:`raw`: :class:`~kytos.core.buffers.KytosEventBuffer` with events | ||
received from network. | ||
:attr:`msg_in`: :class:`~kytos.core.buffers.KytosEventBuffer` with | ||
events to be received. | ||
:attr:`msg_out`: :class:`~kytos.core.buffers.KytosEventBuffer` with | ||
events to be sent. | ||
:attr:`app`: :class:`~kytos.core.buffers.KytosEventBuffer` with events | ||
sent to NApps. | ||
""" | ||
|
||
self._pool_max_workers = get_thread_pool_max_workers() | ||
|
||
self.conn = KytosEventBuffer("conn") | ||
self.raw = KytosEventBuffer( | ||
"raw", | ||
queue=Queue(maxsize=self._get_maxsize("sb")) | ||
) | ||
self.msg_in = KytosEventBuffer( | ||
"msg_in", | ||
queue=PriorityQueue(maxsize=self._get_maxsize("sb")), | ||
) | ||
self.msg_out = KytosEventBuffer( | ||
"msg_out", | ||
queue=PriorityQueue(maxsize=self._get_maxsize("sb")), | ||
) | ||
self.app = KytosEventBuffer( | ||
"app", | ||
queue=Queue(maxsize=self._get_maxsize("app")), | ||
) | ||
|
||
buffer_conf = KytosConfig().options['daemon'].event_buffer_conf | ||
|
||
for name, config in buffer_conf.items(): | ||
setattr(self, name, buffer_from_config(name, config)) | ||
|
||
def get_all_buffers(self): | ||
"""Get all KytosEventBuffer instances.""" | ||
return [ | ||
event_buffer for event_buffer in self.__dict__.values() | ||
if isinstance(event_buffer, KytosEventBuffer) | ||
] | ||
|
||
def _get_maxsize(self, queue_name): | ||
"""Get queue maxsize if it's been set.""" | ||
return self._pool_max_workers.get(queue_name, 0) | ||
|
||
def send_stop_signal(self): | ||
"""Send a ``kytos/core.shutdown`` event to each buffer.""" | ||
LOG.info('Stop signal received by Kytos buffers.') | ||
LOG.info('Sending KytosShutdownEvent to all apps.') | ||
event = KytosEvent(name='kytos/core.shutdown') | ||
for buffer in self.get_all_buffers(): | ||
buffer.put(event) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
"""Test kytos buffers functionalities.""" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.