Source code for slacm.port

'''
Created on Sep 18, 2020

@author: esdev
'''

import zmq
import logging
from slacm.exceptions import UndefinedOperation,PortOperationError

try:
    import cPickle
    pickle = cPickle
except:
    cPickle = None
    import pickle

[docs] class Port(object): ''' Base class for all port types. ''' def __init__(self, parent, name, spec=None): self.logger = logging.getLogger(__name__) self.parent = parent self.name = name self.spec = spec self.index = self.parent.get_next_index() self.context = parent.context self.netInfo = parent.get_netInfo() self.socket = None self.owner = None self.portNum = -1 self.host = None
[docs] def is_msg_local(self): raise UndefinedOperation('Port.is_msg_local')
[docs] def getIndex(self): return self.index
[docs] def setup(self,owner,disco): raise UndefinedOperation('Port.setup')
[docs] def finalize(self,disco): raise UndefinedOperation('Port.finalize')
[docs] def getSocket(self): return self.socket
[docs] def inSocket(self): raise UndefinedOperation('Port.inSocket')
[docs] def activate(self): pass
[docs] def deactivate(self): pass
[docs] def terminate(self): pass
[docs] def send_pyobj(self,msg): ''' Send a Python object via the port. ''' try: result = self.socket.send_pyobj(msg) except zmq.error.ZMQError as e: raise PortOperationError(f"send error [{e.errno}]") from e return result
[docs] def recv_pyobj(self): ''' Receive a Python object via the port. ''' try: result = self.socket.recv_pyobj() except zmq.error.ZMQError as e: raise PortOperationError(f"recv error [{e.errno}]") from e return result
[docs] def send(self,msg): ''' Send a bytearray via the port. ''' try: result = self.socket.send(msg) except zmq.error.ZMQError as e: raise PortOperationError(f"send error [{e.errno}]") from e return result
[docs] def recv(self): ''' Receive a bytearray via the port. ''' try: result = self.socket.recv() except zmq.error.ZMQError as e: raise PortOperationError(f"recv error [{e.errno}]") from e return result
[docs] def formKey(self): raise UndefinedOperation('Port.inSocket')
[docs] def formValue(self): return '%s:%d' % (self.host,self.portNum)
[docs] class UniPort(Port): ''' Base class for uni-directional ports. ''' def __init__(self, parent, name, spec=None): super().__init__(parent,name,spec) self.isLocalPort = self.is_msg_local()
[docs] def is_msg_local(self): return self.parent.is_local(self.spec.type)
[docs] def formKey(self): return self.spec.type.name + (('@' + self.netInfo.macAddress) if self.isLocalPort else '')
[docs] class BiPort(Port): ''' Base class for bi-directional ports ''' def __init__(self, parent, name, spec=None): super().__init__(parent,name,spec) self.isLocalPort = self.is_msg_local()
[docs] def is_msg_local(self): return self.parent.is_local(self.spec.req_type) and \ self.parent.is_local(self.spec.rep_type)
[docs] def formKey(self): return self.spec.req_type.name + '#' + self.spec.rep_type.name + \ (('@' + self.netInfo.macAddress) if self.isLocalPort else '')