35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
from dependency_injector.wiring import inject, Provide
|
|
|
|
from colony.core.logger.logging import get_logger
|
|
|
|
|
|
class Dispatcher:
|
|
def __init__(self, network, role_registry):
|
|
self.logger = get_logger(self.__class__.__name__)
|
|
|
|
self.network = network
|
|
self.role_registry = role_registry
|
|
|
|
def dispatch(self, payload):
|
|
self.logger.debug(f"Dispatching payload for command {payload['command']['role']}.{payload["command"]['name']}")
|
|
|
|
c = payload["command"]
|
|
role_name = c["role"]
|
|
command_name = c["name"]
|
|
args = tuple(c.get("args", []))
|
|
kwargs = dict(c.get("kwargs", {}))
|
|
|
|
role_entry = self.role_registry.get_role_class_by_name(role_name)
|
|
if role_entry is None:
|
|
raise ValueError(f"Unknown role {role_name}")
|
|
|
|
commands_enum = role_entry.COMMANDS
|
|
command = commands_enum(f"{role_name}.{command_name}")
|
|
|
|
node = self.network.get_self()
|
|
|
|
self.logger.info(f"Executing {role_name}.{command_name} on local node {node.id}")
|
|
result = node.execute_local(command, *args, **kwargs)
|
|
self.logger.debug(f"Passing the results from {role_name}.{command_name}")
|
|
return result
|