class QsfpServiceClient(QsfpService.Client): DEFAULT_PORT = 5910 DEFAULT_TIMEOUT = 10.0 # we ignore the value of port def __init__(self, host, port=None, timeout=None): # In a box with all 32 QSFP ports populated, it takes about 7.5s right # now to read all 32 QSFP ports. So, put the defaut timeout to 10s. self.host = host timeout = timeout or self.DEFAULT_TIMEOUT self._socket = TSocket(host, self.DEFAULT_PORT) # TSocket.setTimeout() takes a value in milliseconds self._socket.setTimeout(timeout * 1000) self._transport = THeaderTransport(self._socket) self._protocol = THeaderProtocol(self._transport) self._transport.open() QsfpService.Client.__init__(self, self._protocol) def __enter__(self): return self def __exit__(self, type, value, traceback): self._transport.close()
class FbossAgentClient(FbossCtrl.Client): DEFAULT_PORT = 5909 def __init__(self, host, port=None, timeout=5.0): self.host = host if port is None: port = self.DEFAULT_PORT self._socket = TSocket(host, port) # TSocket.setTimeout() takes a value in milliseconds self._socket.setTimeout(timeout * 1000) self._transport = THeaderTransport(self._socket) self._protocol = THeaderProtocol(self._transport) self._transport.open() FbossCtrl.Client.__init__(self, self._protocol) def __enter__(self): return self def __exit__(self, type, value, traceback): self._transport.close() # # The getPortStats() thrift API was unfortunately renamed to getPortInfo(). # Here's a hacky workaround that tries to do the right thing regardless of # whether the switch we are talking to supports getPortStats() or # getPortInfo(). # def getPortStats(self, *args, **kwargs): return self.getPortInfo(*args, **kwargs) def getAllPortStats(self, *args, **kwargs): return self.getAllPortInfo(*args, **kwargs) def getPortInfo(self, *args, **kwargs): try: return FbossCtrl.Client.getPortInfo(self, *args, **kwargs) except TApplicationException as ex: if 'Method name getPortInfo not found' in str(ex): return FbossCtrl.Client.getPortStats(self, *args, **kwargs) raise def getAllPortInfo(self, *args, **kwargs): try: return FbossCtrl.Client.getAllPortInfo(self, *args, **kwargs) except TApplicationException as ex: if 'Method name getAllPortInfo not found' in str(ex): return FbossCtrl.Client.getAllPortStats(self, *args, **kwargs) raise
class EdenClient(EdenService.Client): ''' EdenClient is a subclass of EdenService.Client that provides a few additional conveniences: - Smarter constructor - Implement the context manager __enter__ and __exit__ methods, so it can be used in with statements. ''' def __init__(self, eden_dir=None, mounted_path=None): self._eden_dir = eden_dir if mounted_path: sock_path = os.readlink( os.path.join(mounted_path, '.eden', 'socket')) else: sock_path = os.path.join(self._eden_dir, SOCKET_PATH) self._socket = TSocket(unix_socket=sock_path) # We used to set a timeout here, but picking the right duration is hard, # and safely retrying an arbitrary thrift call may not be safe. So we # just leave the client with no timeout. #self._socket.setTimeout(60000) # in milliseconds self._transport = THeaderTransport(self._socket) self._protocol = THeaderProtocol(self._transport) super(EdenClient, self).__init__(self._protocol) def __enter__(self): self.open() return self def __exit__(self, exc_type, exc_value, exc_traceback): self.close() def open(self): try: self._transport.open() except TTransportException as ex: self.close() if ex.type == TTransportException.NOT_OPEN: raise EdenNotRunningError(self._eden_dir) raise def close(self): if self._transport is not None: self._transport.close() self._transport = None
class NetlinkManagerClient(NetlinkManagerService.Client): DEFAULT_PORT = 5912 def __init__(self, host, port=None, timeout=5.0): self.host = host if port is None: port = self.DEFAULT_PORT self._socket = TSocket(host, port) self._socket.setTimeout(timeout * 1000) self._transport = THeaderTransport(self._socket) self._protocol = THeaderProtocol(self._transport) self._transport.open() NetlinkManagerService.Client.__init__(self, self._protocol) def __enter__(self): return self def __exit__(self, type, value, traceback): self._transport.close()
class PcapPushSubClient(PcapPushSubscriber.Client): DEFAULT_PORT = 5911 def __init__(self, host, port=None, timeout=5.0): self.host = host if port is None: port = self.DEFAULT_PORT self._socket = TSocket(host, port) # TSocket.setTimeout() takes a value in milliseconds self._socket.setTimeout(timeout * 1000) self._transport = THeaderTransport(self._socket) self._protocol = THeaderProtocol(self._transport) self._transport.open() PcapPushSubscriber.Client.__init__(self, self._protocol) def __enter__(self): return self def __exit__(self, type, value, traceback): self._transport.close()
class TestClient(TestService.Client): DEFAULT_PORT = fboss.system_tests.test.constants.DEFAULT_PORT def __init__(self, host, port=None, timeout=10.0): self.host = host if port is None: port = self.DEFAULT_PORT self._socket = TSocket(host, port) self._socket.setTimeout(timeout * 1000) self._transport = THeaderTransport(self._socket) self._protocol = THeaderProtocol(self._transport) self._transport.open() TestService.Client.__init__(self, self._protocol) def __enter__(self): return self def __exit__(self, type, value, traceback): self._transport.close()
class QsfpServiceClient(QsfpService.Client): DEFAULT_PORT = 5910 # we ignore the value of port def __init__(self, host, port=None, timeout=2.0): self.host = host self._socket = TSocket(host, self.DEFAULT_PORT) # TSocket.setTimeout() takes a value in milliseconds self._socket.setTimeout(timeout * 1000) self._transport = THeaderTransport(self._socket) self._protocol = THeaderProtocol(self._transport) self._transport.open() QsfpService.Client.__init__(self, self._protocol) def __enter__(self): return self def __exit__(self, type, value, traceback): self._transport.close()
class PlainTextFbossAgentClientDontUseInFb(FbossCtrl.Client): DEFAULT_PORT = 5909 def __init__(self, host, port=None, timeout=5.0): self.host = host if port is None: port = self.DEFAULT_PORT self._socket = TSocket(host, port) # TSocket.setTimeout() takes a value in milliseconds self._socket.setTimeout(timeout * 1000) self._transport = THeaderTransport(self._socket) self._protocol = THeaderProtocol(self._transport) self._transport.open() FbossCtrl.Client.__init__(self, self._protocol) def __enter__(self): return self def __exit__(self, type, value, traceback): self._transport.close()
class EdenClient(EdenService.Client): """ EdenClient is a subclass of EdenService.Client that provides a few additional conveniences: - Smarter constructor - Implement the context manager __enter__ and __exit__ methods, so it can be used in with statements. """ def __init__(self, eden_dir=None, socket_path=None): if socket_path is not None: self._socket_path = socket_path elif eden_dir is not None: self._socket_path = os.path.join(eden_dir, SOCKET_PATH) else: raise TypeError("one of eden_dir or socket_path is required") self._socket = TSocket(unix_socket=self._socket_path) # We used to set a timeout here, but picking the right duration is hard, # and safely retrying an arbitrary thrift call may not be safe. So we # just leave the client with no timeout. # self._socket.setTimeout(60000) # in milliseconds self._transport = THeaderTransport(self._socket) self._protocol = THeaderProtocol(self._transport) super(EdenClient, self).__init__(self._protocol) def __enter__(self): self.open() return self def __exit__(self, exc_type, exc_value, exc_traceback): self.close() def open(self): try: self._transport.open() except TTransportException as ex: self.close() if ex.type == TTransportException.NOT_OPEN: raise EdenNotRunningError(self._socket_path) raise def close(self): if self._transport is not None: self._transport.close() self._transport = None def shutdown(self): self.initiateShutdown( "EdenClient.shutdown() invoked with no reason by pid=%s uid=%s" % (os.getpid(), os.getuid())) def initiateShutdown(self, reason): """Helper for stopping the server. To swing through the transition from calling the base shutdown() method with context to the initiateShutdown() method with a reason, we want to try the latter method first, falling back to the old way to handle the case where we deploy a newer client while an older server is still running on the local system.""" try: super().initiateShutdown(reason) except TApplicationException as ex: if ex.type == TApplicationException.UNKNOWN_METHOD: # Running an older server build, fall back to the old shutdown # method with no context super().shutdown() else: raise