summaryrefslogtreecommitdiffstats
path: root/scripts/automation/trex_control_plane/client
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2016-01-26 08:57:43 -0500
committerimarom <imarom@cisco.com>2016-01-26 08:58:49 -0500
commit2828fc9aab33b742c59a499dbf06ea2239ec6220 (patch)
tree8385177f873a06d8c4574fb6721bf8c9a74a60c3 /scripts/automation/trex_control_plane/client
parent4c6450049d82fb9f98dbafe98d3ea1e229bf2a6d (diff)
API simplification and example
Diffstat (limited to 'scripts/automation/trex_control_plane/client')
-rw-r--r--scripts/automation/trex_control_plane/client/trex_port.py60
-rwxr-xr-xscripts/automation/trex_control_plane/client/trex_stateless_client.py77
2 files changed, 40 insertions, 97 deletions
diff --git a/scripts/automation/trex_control_plane/client/trex_port.py b/scripts/automation/trex_control_plane/client/trex_port.py
index 438ff4be..c8147faf 100644
--- a/scripts/automation/trex_control_plane/client/trex_port.py
+++ b/scripts/automation/trex_control_plane/client/trex_port.py
@@ -49,7 +49,6 @@ class Port(object):
self.streams = {}
self.profile = None
self.session_id = session_id
- self.loaded_stream_pack = None
self.port_stats = trex_stats.CPortStats(self)
@@ -139,63 +138,44 @@ class Port(object):
# operations on port can be done on state idle or state streams
return ((self.state == self.STATE_IDLE) or (self.state == self.STATE_STREAMS))
- # add stream to the port
- def add_stream (self, stream_id, stream_obj):
- if not self.is_port_writable():
- return self.err("Please stop port before attempting to add streams")
-
-
- params = {"handler": self.handler,
- "port_id": self.port_id,
- "stream_id": stream_id,
- "stream": stream_obj}
+ # add streams
+ def add_streams (self, streams_list):
- rc = self.transmit("add_stream", params)
- if rc.bad():
- return self.err(rc.err())
-
- # add the stream
- self.streams[stream_id] = StreamOnPort(stream_obj, Port._generate_stream_metadata(stream_id, stream_obj))
-
- # the only valid state now
- self.state = self.STATE_STREAMS
+ if not self.is_acquired():
+ return self.err("port is not owned")
- return self.ok()
+ if not self.is_port_writable():
+ return self.err("Please stop port before attempting to add streams")
- # add multiple streams
- def add_streams (self, LoadedStreamList_obj):
batch = []
+ for stream in (streams_list if isinstance(streams_list, list) else [streams_list]):
- self.loaded_stream_pack = LoadedStreamList_obj
- compiled_stream_list = LoadedStreamList_obj.compiled
-
- for stream_pack in compiled_stream_list:
params = {"handler": self.handler,
"port_id": self.port_id,
- "stream_id": stream_pack.stream_id,
- "stream": stream_pack.stream}
+ "stream_id": stream.get_id(),
+ "stream": stream.to_json()}
cmd = RpcCmdData('add_stream', params)
batch.append(cmd)
+ # meta data for show streams
+ self.streams[stream.get_id()] = StreamOnPort(stream.to_json(),
+ Port._generate_stream_metadata(stream.get_id(), stream.to_json()))
+
rc = self.transmit_batch(batch)
- if rc.bad():
+ if not rc:
return self.err(rc.err())
- # validate that every action succeeded
-
- # add the stream
- for stream_pack in compiled_stream_list:
- self.streams[stream_pack.stream_id] = StreamOnPort(stream_pack.stream,
- Port._generate_stream_metadata(stream_pack.stream_id,
- stream_pack.stream))
+
# the only valid state now
self.state = self.STATE_STREAMS
return self.ok()
+
+
# remove stream from port
def remove_stream (self, stream_id):
@@ -461,10 +441,6 @@ class Port(object):
def generate_loaded_streams_sum(self, stream_id_list):
if self.state == self.STATE_DOWN or self.state == self.STATE_STREAMS:
return {}
- elif self.loaded_stream_pack is None:
- # avoid crashing when sync with remote server isn't operational
- # TODO: MAKE SURE TO HANDLE THIS CASE FOR BETTER UX
- return {}
streams_data = {}
if not stream_id_list:
@@ -477,7 +453,7 @@ class Port(object):
if stream_id in self.streams}
- return {"referring_file" : self.loaded_stream_pack.name,
+ return {"referring_file" : "",
"streams" : streams_data}
@staticmethod
diff --git a/scripts/automation/trex_control_plane/client/trex_stateless_client.py b/scripts/automation/trex_control_plane/client/trex_stateless_client.py
index 6b8e42a6..886edb61 100755
--- a/scripts/automation/trex_control_plane/client/trex_stateless_client.py
+++ b/scripts/automation/trex_control_plane/client/trex_stateless_client.py
@@ -23,56 +23,9 @@ import re
import random
from trex_port import Port
from common.trex_types import *
+from common.trex_stl_exceptions import *
from trex_async_client import CTRexAsyncClient
-# basic error for API
-class STLError(Exception):
- def __init__ (self, msg):
- self.msg = str(msg)
-
- def __str__ (self):
- exc_type, exc_obj, exc_tb = sys.exc_info()
- fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
-
-
- s = "\n******\n"
- s += "Error at {0}:{1}\n\n".format(format_text(fname, 'bold'), format_text(exc_tb.tb_lineno), 'bold')
- s += "specific error:\n\n{0}\n".format(format_text(self.msg, 'bold'))
-
- return s
-
- def brief (self):
- return self.msg
-
-
-# raised when the client state is invalid for operation
-class STLStateError(STLError):
- def __init__ (self, op, state):
- self.msg = "Operation '{0}' is not valid while '{1}'".format(op, state)
-
-
-# port state error
-class STLPortStateError(STLError):
- def __init__ (self, port, op, state):
- self.msg = "Operation '{0}' on port(s) '{1}' is not valid while port(s) '{2}'".format(op, port, state)
-
-
-# raised when argument is not valid for operation
-class STLArgumentError(STLError):
- def __init__ (self, name, got, valid_values = None, extended = None):
- self.msg = "Argument: '{0}' invalid value: '{1}'".format(name, got)
- if valid_values:
- self.msg += " - valid values are '{0}'".format(valid_values)
-
- if extended:
- self.msg += "\n{0}".format(extended)
-
-# raised when timeout occurs
-class STLTimeoutError(STLError):
- def __init__ (self, timeout):
- self.msg = "Timeout: operation took more than '{0}' seconds".format(timeout)
-
-
############################ logger #############################
############################ #############################
@@ -541,14 +494,14 @@ class STLClient(object):
return rc
- def __add_stream(self, stream_id, stream_obj, port_id_list = None):
+ def __add_streams(self, stream_list, port_id_list = None):
port_id_list = self.__ports(port_id_list)
rc = RC()
for port_id in port_id_list:
- rc.add(self.ports[port_id].add_stream(stream_id, stream_obj))
+ rc.add(self.ports[port_id].add_streams(stream_list))
return rc
@@ -1209,7 +1162,8 @@ class STLClient(object):
:parameters:
ports : list
ports to execute the command
-
+ streams: list
+ streams to attach
:raises:
+ :exc:`STLError`
@@ -1226,8 +1180,16 @@ class STLClient(object):
if not rc:
raise STLArgumentError('ports', ports, valid_values = self.get_all_ports())
- self.logger.pre_cmd("Attaching {0} streams to port(s) {1}:".format(len(streams.compiled), ports))
- rc = self.__add_stream_pack(streams, ports)
+ # transform single stream
+ if not isinstance(streams, list):
+ streams = [streams]
+
+ # check streams
+ if not all([isinstance(stream, STLStream) for stream in streams]):
+ raise STLArgumentError('streams', streams)
+
+ self.logger.pre_cmd("Attaching {0} streams to port(s) {1}:".format(len(streams), ports))
+ rc = self.__add_streams(streams, ports)
self.logger.post_cmd(rc)
if not rc:
@@ -1266,11 +1228,16 @@ class STLClient(object):
# load the YAML
try:
- streams = self.streams_db.load_yaml_file(filename)
+ streams_pack = self.streams_db.load_yaml_file(filename)
except Exception as e:
raise STLError(str(e))
- # attach
+ # HACK - convert the stream pack to simple streams
+ streams = []
+ for stream in streams_pack.compiled:
+ s = HACKSTLStream(stream)
+ streams.append(s)
+
self.add_streams(streams, ports)