summaryrefslogtreecommitdiffstats
path: root/scripts/automation/trex_control_plane/stf
diff options
context:
space:
mode:
authorYaroslav Brustinov <ybrustin@cisco.com>2016-05-13 20:11:51 +0300
committerYaroslav Brustinov <ybrustin@cisco.com>2016-05-13 20:11:51 +0300
commit89b608ae766705950efc5f4914b01b9a32b6a0e7 (patch)
treee5b044865eb02fedce4d4e3f9b735cadeaf5f997 /scripts/automation/trex_control_plane/stf
parentfa7a837fb19af1c1fe4365de3f71467b79c2c865 (diff)
add master daemon
Diffstat (limited to 'scripts/automation/trex_control_plane/stf')
-rwxr-xr-xscripts/automation/trex_control_plane/stf/trex_stf_lib/trex_client.py224
1 files changed, 210 insertions, 14 deletions
diff --git a/scripts/automation/trex_control_plane/stf/trex_stf_lib/trex_client.py b/scripts/automation/trex_control_plane/stf/trex_stf_lib/trex_client.py
index fd409b16..342c75de 100755
--- a/scripts/automation/trex_control_plane/stf/trex_stf_lib/trex_client.py
+++ b/scripts/automation/trex_control_plane/stf/trex_stf_lib/trex_client.py
@@ -39,7 +39,7 @@ class CTRexClient(object):
This class defines the client side of the RESTfull interaction with TRex
"""
- def __init__(self, trex_host, max_history_size = 100, filtered_latency_amount = 0.001, trex_daemon_port = 8090, trex_zmq_port = 4500, verbose = False):
+ def __init__(self, trex_host, max_history_size = 100, filtered_latency_amount = 0.001, trex_daemon_port = 8090, master_daemon_port = 8091, trex_zmq_port = 4500, verbose = False):
"""
Instantiate a TRex client object, and connecting it to listening daemon-server
@@ -60,6 +60,10 @@ class CTRexClient(object):
the port number on which the trex-daemon server can be reached
default value: **8090**
+ master_daemon_port : int
+ the port number on which the master-daemon server can be reached
+
+ default value: **8091**
trex_zmq_port : int
the port number on which trex's zmq module will interact with daemon server
@@ -78,19 +82,50 @@ class CTRexClient(object):
except: # give it another try
self.trex_host = socket.gethostbyname(trex_host)
self.trex_daemon_port = trex_daemon_port
+ self.master_daemon_port = master_daemon_port
self.trex_zmq_port = trex_zmq_port
self.seq = None
+ self._last_sample = time.time()
+ self.__default_user = get_current_user()
self.verbose = verbose
self.result_obj = CTRexResult(max_history_size, filtered_latency_amount)
self.decoder = JSONDecoder()
- self.trex_server_path = "http://{hostname}:{port}/".format( hostname = self.trex_host, port = trex_daemon_port )
- self.__verbose_print("Connecting to TRex @ {trex_path} ...".format( trex_path = self.trex_server_path ) )
self.history = jsonrpclib.history.History()
- self.server = jsonrpclib.Server(self.trex_server_path, history = self.history)
- self.check_server_connectivity()
- self.__verbose_print("Connection established successfully!")
- self._last_sample = time.time()
- self.__default_user = get_current_user()
+ self.master_daemon_path = "http://{hostname}:{port}/".format( hostname = self.trex_host, port = master_daemon_port )
+ self.trex_server_path = "http://{hostname}:{port}/".format( hostname = self.trex_host, port = trex_daemon_port )
+ self.connect_master()
+ self.connect_server()
+
+
+ def connect_master(self):
+ '''
+ Connects to Master daemon via JsonRPC.
+ This daemon controls TRex daemon server.
+ '''
+ try:
+ print('Connecting to Master daemon @ %s ...' % self.master_daemon_path)
+ self.master_daemon = jsonrpclib.Server(self.master_daemon_path, history = self.history)
+ print self.check_master_connectivity()
+ print('Connected to Master daemon.')
+ return True
+ except Exception as e:
+ print(e)
+ return False
+
+ def connect_server(self):
+ '''
+ Connects to TRex daemon server via JsonRPC.
+ This daemon controls TRex. (start/stop
+ '''
+ try:
+ print('Connecting to TRex daemon server @ %s ...' % self.trex_server_path)
+ self.server = jsonrpclib.Server(self.trex_server_path, history = self.history)
+ self.check_server_connectivity()
+ print('Connected TRex server daemon.')
+ return True
+ except Exception as e:
+ print(e)
+ return False
def add (self, x, y):
@@ -105,7 +140,7 @@ class CTRexClient(object):
def start_trex (self, f, d, block_to_success = True, timeout = 40, user = None, trex_development = False, **trex_cmd_options):
"""
- Request to start a TRex run on server.
+ Request to start a TRex run on server in stateful mode.
:parameters:
f : str
@@ -168,6 +203,53 @@ class CTRexClient(object):
else: # TRex is has been started by another user
raise TRexInUseError('TRex is already being used by another user or process. Try again once TRex is back in IDLE state.')
+
+ def start_stateless(self, block_to_success = True, timeout = 40, user = None, **trex_cmd_options):
+ """
+ Request to start a TRex run on server in stateless mode.
+
+ :parameters:
+ block_to_success : bool
+ determine if this method blocks until TRex changes state from 'Starting' to either 'Idle' or 'Running'
+
+ default value : **True**
+ timeout : int
+ maximum time (in seconds) to wait in blocking state until TRex changes state from 'Starting' to either 'Idle' or 'Running'
+
+ default value: **40**
+ user : str
+ the identity of the the run issuer.
+ trex_cmd_options : key, val
+ sets desired TRex options using key=val syntax, separated by comma.
+ for keys with no value, state key=True
+
+ :return:
+ **True** on success
+
+ :raises:
+ + :exc:`trex_exceptions.TRexError`, in case one of the trex_cmd_options raised an exception at server.
+ + :exc:`trex_exceptions.TRexInUseError`, in case TRex is already taken.
+ + :exc:`trex_exceptions.TRexRequestDenied`, in case TRex is reserved for another user than the one trying start TRex.
+ + ProtocolError, in case of error in JSON-RPC protocol.
+
+ """
+ try:
+ user = user or self.__default_user
+ retval = self.server.start_trex(trex_cmd_options, user, block_to_success, timeout, True)
+ except AppError as err:
+ self._handle_AppError_exception(err.args[0])
+ except ProtocolError:
+ raise
+ finally:
+ self.prompt_verbose_data()
+
+ if retval!=0:
+ self.seq = retval # update seq num only on successful submission
+ return True
+ else: # TRex is has been started by another user
+ raise TRexInUseError('TRex is already being used by another user or process. Try again once TRex is back in IDLE state.')
+
+
def stop_trex (self):
"""
Request to stop a TRex run on server.
@@ -238,6 +320,40 @@ class CTRexClient(object):
finally:
self.prompt_verbose_data()
+ def kill_all_trexes(self):
+ """
+ Kills running TRex processes (if exists) on the server, not only owned by current daemon.
+ Raises exception upon error killing.
+
+ :return:
+ + **True** if any process killed
+ + **False** otherwise.
+
+ """
+ try:
+ return self.server.kill_all_trexes()
+ except AppError as err:
+ self._handle_AppError_exception(err.args[0])
+ finally:
+ self.prompt_verbose_data()
+
+
+ def get_trex_cmds(self):
+ """
+ Gets list of running TRex pids and command lines.
+ Can be used to verify if any TRex is running.
+
+ :return:
+ List of tuples (pid, command) of running TRexes
+ """
+ try:
+ return self.server.get_trex_cmds()
+ except AppError as err:
+ self._handle_AppError_exception(err.args[0])
+ finally:
+ self.prompt_verbose_data()
+
+
def wait_until_kickoff_finish(self, timeout = 40):
"""
Block the client application until TRex changes state from 'Starting' to either 'Idle' or 'Running'
@@ -306,8 +422,9 @@ class CTRexClient(object):
raise
except ProtocolError as err:
raise
- finally:
- self.prompt_verbose_data()
+ #is printed by self.get_running_info()
+ #finally:
+ # self.prompt_verbose_data()
def is_idle (self):
"""
@@ -844,11 +961,11 @@ class CTRexClient(object):
return method_to_call()
except socket.error as e:
if e.errno == errno.ECONNREFUSED:
- raise SocketError(errno.ECONNREFUSED, "Connection from TRex server was refused. Please make sure the server is up.")
+ raise SocketError(errno.ECONNREFUSED, "Connection to TRex daemon server was refused. Please make sure the server is up.")
def check_server_connectivity (self):
"""
- Checks for server valid connectivity.
+ Checks TRex daemon server for connectivity.
"""
try:
socket.gethostbyname(self.trex_host)
@@ -857,7 +974,86 @@ class CTRexClient(object):
raise socket.gaierror(e.errno, "Could not resolve server hostname. Please make sure hostname entered correctly.")
except socket.error as e:
if e.errno == errno.ECONNREFUSED:
- raise socket.error(errno.ECONNREFUSED, "Connection from TRex server was refused. Please make sure the server is up.")
+ raise socket.error(errno.ECONNREFUSED, "Connection to TRex daemon server was refused. Please make sure the server is up.")
+ finally:
+ self.prompt_verbose_data()
+
+
+ def master_add(self, x, y):
+ ''' Sanity check for Master daemon '''
+ try:
+ return self.master_daemon.add(x,y)
+ except AppError as err:
+ self._handle_AppError_exception(err.args[0])
+ finally:
+ self.prompt_verbose_data()
+
+
+ def check_master_connectivity (self):
+ '''
+ Check Master daemon for connectivity.
+ Return True upon success
+ '''
+ try:
+ socket.gethostbyname(self.trex_host)
+ return self.master_daemon.check_connectivity()
+ except socket.gaierror as e:
+ raise socket.gaierror(e.errno, "Could not resolve server hostname. Please make sure hostname entered correctly.")
+ except socket.error as e:
+ if e.errno == errno.ECONNREFUSED:
+ raise socket.error(errno.ECONNREFUSED, "Connection to Master daemon was refused. Please make sure the server is up.")
+ finally:
+ self.prompt_verbose_data()
+
+ def is_trex_daemon_running(self):
+ '''
+ Check if TRex server daemon is running.
+ Returns True/False
+ '''
+ try:
+ return self.master_daemon.is_trex_daemon_running()
+ except AppError as err:
+ self._handle_AppError_exception(err.args[0])
+ finally:
+ self.prompt_verbose_data()
+
+ def restart_trex_daemon(self):
+ '''
+ Restart TRex server daemon. Useful after update.
+ Will not fail if daemon is initially stopped.
+ '''
+ try:
+ return self.master_daemon.restart_trex_daemon()
+ except AppError as err:
+ self._handle_AppError_exception(err.args[0])
+ finally:
+ self.prompt_verbose_data()
+
+ def start_trex_daemon(self):
+ '''
+ Start TRex server daemon.
+ :return:
+ + **True** if success.
+ + **False** if TRex server daemon already running.
+ '''
+ try:
+ return self.master_daemon.start_trex_daemon()
+ except AppError as err:
+ self._handle_AppError_exception(err.args[0])
+ finally:
+ self.prompt_verbose_data()
+
+ def stop_trex_daemon(self):
+ '''
+ Stop TRex server daemon.
+ :return:
+ + **True** if success.
+ + **False** if TRex server daemon already running.
+ '''
+ try:
+ return self.master_daemon.stop_trex_daemon()
+ except AppError as err:
+ self._handle_AppError_exception(err.args[0])
finally:
self.prompt_verbose_data()