def send_event_outside(self, event, dstNode=None):
        filterEvents = set([
            "AgentStartEvent", "AgentExitEvent", "NewNodeEvent",
            "NodeExitEvent", "NodeLostEvent", "BrokerDiscoveredEvent",
            "ConnectionEstablishedEvent", "ConnectionLostEvent",
            "SendHelloMsgTimeEvent", "HelloMsgTimeoutEvent"
        ])

        if event.__class__.__name__ in filterEvents:
            return

        # flatten event
        self.log.debug("Event name: {}".format(event.__class__.__name__))
        if event.srcNode and isinstance(event.srcNode, Node):
            event.srcNode = event.srcNode.uuid
            event.node = None
        if event.srcModule and isinstance(event.srcModule,
                                          modules.UniFlexModule):
            event.srcModule = event.srcModule.uuid

        topic = event.__class__.__name__

        if dstNode:
            topic = dstNode.uuid

        self.log.debug("sends cmd event : {} on topic: {}".format(
            event.__class__.__name__, topic))

        msgDesc = msgs.MessageDescription()
        msgDesc.msgType = event.__class__.__name__
        msgDesc.serializationType = msgs.SerializationType.PICKLE

        data = event
        msgContainer = [topic, msgDesc, data]
        self.send(msgContainer)
    def send_node_add_notification(self, dest):
        topic = dest
        msgDesc = msgs.MessageDescription()
        msgDesc.msgType = msgs.get_msg_type(msgs.NodeAddNotification)
        msgDesc.serializationType = msgs.SerializationType.PROTOBUF

        msg = msgs.NodeAddNotification()
        msg.agent_uuid = self.agent.uuid
        msgContainer = [topic, msgDesc, msg]
        self.log.debug("Agent sends node add notification")
        self._transportChannel.send(msgContainer)
    def send_hello_msg(self, timeout=10):
        self.log.debug("Agent sends HelloMsg")
        topic = "HELLO_MSG"
        msgDesc = msgs.MessageDescription()
        msgDesc.msgType = msgs.get_msg_type(msgs.HelloMsg)
        msgDesc.serializationType = msgs.SerializationType.PROTOBUF

        msg = msgs.HelloMsg()
        msg.uuid = str(self.agent.uuid)
        msg.timeout = timeout
        msgContainer = [topic, msgDesc, msg]
        self._transportChannel.send(msgContainer)
    def notify_node_exit(self):
        self.log.debug("Agend sends NodeExitMsg".format())
        topic = "NODE_EXIT"
        msgDesc = msgs.MessageDescription()
        msgDesc.msgType = msgs.get_msg_type(msgs.NodeExitMsg)
        msgDesc.serializationType = msgs.SerializationType.PROTOBUF

        msg = msgs.NodeExitMsg()
        msg.agent_uuid = self.agent.uuid
        msg.reason = "Process terminated"

        msgContainer = [topic, msgDesc, msg]
        self._transportChannel.send(msgContainer)
    def send_node_info_request(self, dest=None):
        topic = "ALL"
        if dest:
            topic = dest
        msgDesc = msgs.MessageDescription()
        msgDesc.msgType = msgs.get_msg_type(msgs.NodeInfoRequest)
        msgDesc.serializationType = msgs.SerializationType.PROTOBUF

        msg = msgs.NodeInfoRequest()
        msg.agent_uuid = self.agent.uuid
        msgContainer = [topic, msgDesc, msg]
        self.log.debug("Agent sends node info request")
        self._transportChannel.send(msgContainer)
    def send_node_info(self, dest=None):
        topic = "NODE_INFO"
        if dest:
            topic = dest

        msgDesc = msgs.MessageDescription()
        msgDesc.msgType = msgs.get_msg_type(msgs.NodeInfoMsg)
        msgDesc.serializationType = msgs.SerializationType.PROTOBUF

        msg = msgs.NodeInfoMsg()
        msg.agent_uuid = self.agent.uuid
        msg.ip = self.agent.ip
        msg.name = self.agent.name
        msg.hostname = socket.gethostname()
        msg.info = self.agent.info

        for uuid, module in self.agent.moduleManager.modules.items():
            if isinstance(module, modules.CoreModule):
                continue

            moduleMsg = msg.modules.add()
            moduleMsg.uuid = module.uuid
            moduleMsg.name = module.name
            moduleMsg.type = msgs.Module.MODULE

            if isinstance(module, modules.ControlApplication):
                moduleMsg.type = msgs.Module.APPLICATION
            else:
                moduleMsg.type = msgs.Module.MODULE

            if module.device:
                moduleMsg.type = msgs.Module.DEVICE
                deviceDesc = msgs.Device()
                deviceDesc.name = module.device
                moduleMsg.device.CopyFrom(deviceDesc)

            for name in module.get_functions():
                function = moduleMsg.functions.add()
                function.name = name
            for name in module.get_in_events():
                event = moduleMsg.in_events.add()
                event.name = name
            for name in module.get_out_events():
                event = moduleMsg.out_events.add()
                event.name = name

        msgContainer = [topic, msgDesc, msg]

        self.log.debug("Agent sends node info")
        self._transportChannel.send(msgContainer)