summaryrefslogtreecommitdiffstats
path: root/scripts/automation/trex_control_plane/client/trex_port.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/automation/trex_control_plane/client/trex_port.py')
-rw-r--r--scripts/automation/trex_control_plane/client/trex_port.py512
1 files changed, 0 insertions, 512 deletions
diff --git a/scripts/automation/trex_control_plane/client/trex_port.py b/scripts/automation/trex_control_plane/client/trex_port.py
deleted file mode 100644
index eaf64ac2..00000000
--- a/scripts/automation/trex_control_plane/client/trex_port.py
+++ /dev/null
@@ -1,512 +0,0 @@
-
-from collections import namedtuple, OrderedDict
-from common.trex_types import *
-from common import trex_stats
-from client_utils import packet_builder
-
-StreamOnPort = namedtuple('StreamOnPort', ['compiled_stream', 'metadata'])
-
-########## utlity ############
-def mult_to_factor (mult, max_bps_l2, max_pps, line_util):
- if mult['type'] == 'raw':
- return mult['value']
-
- if mult['type'] == 'bps':
- return mult['value'] / max_bps_l2
-
- if mult['type'] == 'pps':
- return mult['value'] / max_pps
-
- if mult['type'] == 'percentage':
- return mult['value'] / line_util
-
-
-# describes a single port
-class Port(object):
- STATE_DOWN = 0
- STATE_IDLE = 1
- STATE_STREAMS = 2
- STATE_TX = 3
- STATE_PAUSE = 4
- PortState = namedtuple('PortState', ['state_id', 'state_name'])
- STATES_MAP = {STATE_DOWN: "DOWN",
- STATE_IDLE: "IDLE",
- STATE_STREAMS: "IDLE",
- STATE_TX: "ACTIVE",
- STATE_PAUSE: "PAUSE"}
-
-
- def __init__ (self, port_id, speed, driver, user, comm_link, session_id):
- self.port_id = port_id
- self.state = self.STATE_IDLE
- self.handler = None
- self.comm_link = comm_link
- self.transmit = comm_link.transmit
- self.transmit_batch = comm_link.transmit_batch
- self.user = user
- self.driver = driver
- self.speed = speed
- self.streams = {}
- self.profile = None
- self.session_id = session_id
-
- self.port_stats = trex_stats.CPortStats(self)
-
-
- def err(self, msg):
- return RC_ERR("port {0} : {1}".format(self.port_id, msg))
-
- def ok(self, data = ""):
- return RC_OK(data)
-
- def get_speed_bps (self):
- return (self.speed * 1000 * 1000 * 1000)
-
- # take the port
- def acquire(self, force = False):
- params = {"port_id": self.port_id,
- "user": self.user,
- "session_id": self.session_id,
- "force": force}
-
- command = RpcCmdData("acquire", params)
- rc = self.transmit(command.method, command.params)
- if rc.good():
- self.handler = rc.data()
- return self.ok()
- else:
- return self.err(rc.err())
-
- # release the port
- def release(self):
- params = {"port_id": self.port_id,
- "handler": self.handler}
-
- command = RpcCmdData("release", params)
- rc = self.transmit(command.method, command.params)
- self.handler = None
-
- if rc.good():
- return self.ok()
- else:
- return self.err(rc.err())
-
- def is_acquired(self):
- return (self.handler != None)
-
- def is_active(self):
- return(self.state == self.STATE_TX ) or (self.state == self.STATE_PAUSE)
-
- def is_transmitting (self):
- return (self.state == self.STATE_TX)
-
- def is_paused (self):
- return (self.state == self.STATE_PAUSE)
-
-
- def sync(self):
- params = {"port_id": self.port_id}
-
- command = RpcCmdData("get_port_status", params)
- rc = self.transmit(command.method, command.params)
- if rc.bad():
- return self.err(rc.err())
-
- # sync the port
- port_state = rc.data()['state']
-
- if port_state == "DOWN":
- self.state = self.STATE_DOWN
- elif port_state == "IDLE":
- self.state = self.STATE_IDLE
- elif port_state == "STREAMS":
- self.state = self.STATE_STREAMS
- elif port_state == "TX":
- self.state = self.STATE_TX
- elif port_state == "PAUSE":
- self.state = self.STATE_PAUSE
- else:
- raise Exception("port {0}: bad state received from server '{1}'".format(self.port_id, port_state))
-
- # TODO: handle syncing the streams into stream_db
-
- return self.ok()
-
-
- # return TRUE if write commands
- def is_port_writable (self):
- # 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 streams
- def add_streams (self, streams_list):
-
- if not self.is_acquired():
- return self.err("port is not owned")
-
- if not self.is_port_writable():
- return self.err("Please stop port before attempting to add streams")
-
- batch = []
- for stream in (streams_list if isinstance(streams_list, list) else [streams_list]):
-
- params = {"handler": self.handler,
- "port_id": self.port_id,
- "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 not rc:
- return self.err(rc.err())
-
-
-
- # the only valid state now
- self.state = self.STATE_STREAMS
-
- return self.ok()
-
-
-
- # remove stream from port
- def remove_streams (self, stream_id_list):
-
- if not self.is_acquired():
- return self.err("port is not owned")
-
- if not self.is_port_writable():
- return self.err("Please stop port before attempting to remove streams")
-
- # single element to list
- stream_id_list = stream_id_list if isinstance(stream_id_list, list) else [stream_id_list]
-
- # verify existance
- if not all([stream_id in self.streams for stream_id in stream_id_list]):
- return self.err("stream {0} does not exists".format(stream_id))
-
- batch = []
-
- for stream_id in stream_id_list:
- params = {"handler": self.handler,
- "port_id": self.port_id,
- "stream_id": stream_id}
-
- cmd = RpcCmdData('remove_stream', params)
- batch.append(cmd)
-
- del self.streams[stream_id]
-
-
- rc = self.transmit_batch(batch)
- if not rc:
- return self.err(rc.err())
-
- self.state = self.STATE_STREAMS if (len(self.streams) > 0) else self.STATE_IDLE
-
- return self.ok()
-
-
- # remove all the streams
- def remove_all_streams (self):
-
- if not self.is_acquired():
- return self.err("port is not owned")
-
- if not self.is_port_writable():
- return self.err("Please stop port before attempting to remove streams")
-
- params = {"handler": self.handler,
- "port_id": self.port_id}
-
- rc = self.transmit("remove_all_streams", params)
- if not rc:
- return self.err(rc.err())
-
- self.streams = {}
-
- self.state = self.STATE_IDLE
-
- return self.ok()
-
- # get a specific stream
- def get_stream (self, stream_id):
- if stream_id in self.streams:
- return self.streams[stream_id]
- else:
- return None
-
- def get_all_streams (self):
- return self.streams
-
- # start traffic
- def start (self, mul, duration, force):
- if not self.is_acquired():
- return self.err("port is not owned")
-
- if self.state == self.STATE_DOWN:
- return self.err("Unable to start traffic - port is down")
-
- if self.state == self.STATE_IDLE:
- return self.err("Unable to start traffic - no streams attached to port")
-
- if self.state == self.STATE_TX:
- return self.err("Unable to start traffic - port is already transmitting")
-
- params = {"handler": self.handler,
- "port_id": self.port_id,
- "mul": mul,
- "duration": duration,
- "force": force}
-
- rc = self.transmit("start_traffic", params)
- if rc.bad():
- return self.err(rc.err())
-
- self.state = self.STATE_TX
-
- return self.ok()
-
- # stop traffic
- # with force ignores the cached state and sends the command
- def stop (self, force = False):
-
- if not self.is_acquired():
- return self.err("port is not owned")
-
- # port is already stopped
- if not force:
- if (self.state == self.STATE_IDLE) or (self.state == self.state == self.STATE_STREAMS):
- return self.ok()
-
-
-
- params = {"handler": self.handler,
- "port_id": self.port_id}
-
- rc = self.transmit("stop_traffic", params)
- if rc.bad():
- return self.err(rc.err())
-
- # only valid state after stop
- self.state = self.STATE_STREAMS
-
- return self.ok()
-
- def pause (self):
-
- if not self.is_acquired():
- return self.err("port is not owned")
-
- if (self.state != self.STATE_TX) :
- return self.err("port is not transmitting")
-
- params = {"handler": self.handler,
- "port_id": self.port_id}
-
- rc = self.transmit("pause_traffic", params)
- if rc.bad():
- return self.err(rc.err())
-
- # only valid state after stop
- self.state = self.STATE_PAUSE
-
- return self.ok()
-
-
- def resume (self):
-
- if not self.is_acquired():
- return self.err("port is not owned")
-
- if (self.state != self.STATE_PAUSE) :
- return self.err("port is not in pause mode")
-
- params = {"handler": self.handler,
- "port_id": self.port_id}
-
- rc = self.transmit("resume_traffic", params)
- if rc.bad():
- return self.err(rc.err())
-
- # only valid state after stop
- self.state = self.STATE_TX
-
- return self.ok()
-
-
- def update (self, mul, force):
-
- if not self.is_acquired():
- return self.err("port is not owned")
-
- if (self.state != self.STATE_TX) :
- return self.err("port is not transmitting")
-
- params = {"handler": self.handler,
- "port_id": self.port_id,
- "mul": mul,
- "force": force}
-
- rc = self.transmit("update_traffic", params)
- if rc.bad():
- return self.err(rc.err())
-
- return self.ok()
-
-
- def validate (self):
-
- if not self.is_acquired():
- return self.err("port is not owned")
-
- if (self.state == self.STATE_DOWN):
- return self.err("port is down")
-
- if (self.state == self.STATE_IDLE):
- return self.err("no streams attached to port")
-
- params = {"handler": self.handler,
- "port_id": self.port_id}
-
- rc = self.transmit("validate", params)
- if rc.bad():
- return self.err(rc.err())
-
- self.profile = rc.data()
-
- return self.ok()
-
- def get_profile (self):
- return self.profile
-
-
- def print_profile (self, mult, duration):
- if not self.get_profile():
- return
-
- rate = self.get_profile()['rate']
- graph = self.get_profile()['graph']
-
- print format_text("Profile Map Per Port\n", 'underline', 'bold')
-
- factor = mult_to_factor(mult, rate['max_bps_l2'], rate['max_pps'], rate['max_line_util'])
-
- print "Profile max BPS L2 (base / req): {:^12} / {:^12}".format(format_num(rate['max_bps_l2'], suffix = "bps"),
- format_num(rate['max_bps_l2'] * factor, suffix = "bps"))
-
- print "Profile max BPS L1 (base / req): {:^12} / {:^12}".format(format_num(rate['max_bps_l1'], suffix = "bps"),
- format_num(rate['max_bps_l1'] * factor, suffix = "bps"))
-
- print "Profile max PPS (base / req): {:^12} / {:^12}".format(format_num(rate['max_pps'], suffix = "pps"),
- format_num(rate['max_pps'] * factor, suffix = "pps"),)
-
- print "Profile line util. (base / req): {:^12} / {:^12}".format(format_percentage(rate['max_line_util']),
- format_percentage(rate['max_line_util'] * factor))
-
-
- # duration
- exp_time_base_sec = graph['expected_duration'] / (1000 * 1000)
- exp_time_factor_sec = exp_time_base_sec / factor
-
- # user configured a duration
- if duration > 0:
- if exp_time_factor_sec > 0:
- exp_time_factor_sec = min(exp_time_factor_sec, duration)
- else:
- exp_time_factor_sec = duration
-
-
- print "Duration (base / req): {:^12} / {:^12}".format(format_time(exp_time_base_sec),
- format_time(exp_time_factor_sec))
- print "\n"
-
-
- def get_port_state_name(self):
- return self.STATES_MAP.get(self.state, "Unknown")
-
- ################# stats handler ######################
- def generate_port_stats(self):
- return self.port_stats.generate_stats()
-
- def generate_port_status(self):
- return {"type": self.driver,
- "maximum": "{speed} Gb/s".format(speed=self.speed),
- "status": self.get_port_state_name()
- }
-
- def clear_stats(self):
- return self.port_stats.clear_stats()
-
-
- def get_stats (self):
- return self.port_stats.get_stats()
-
-
- def invalidate_stats(self):
- return self.port_stats.invalidate()
-
- ################# stream printout ######################
- def generate_loaded_streams_sum(self, stream_id_list):
- if self.state == self.STATE_DOWN or self.state == self.STATE_STREAMS:
- return {}
- streams_data = {}
-
- if not stream_id_list:
- # if no mask has been provided, apply to all streams on port
- stream_id_list = self.streams.keys()
-
-
- streams_data = {stream_id: self.streams[stream_id].metadata.get('stream_sum', ["N/A"] * 6)
- for stream_id in stream_id_list
- if stream_id in self.streams}
-
-
- return {"referring_file" : "",
- "streams" : streams_data}
-
- @staticmethod
- def _generate_stream_metadata(stream_id, compiled_stream_obj):
- meta_dict = {}
- # create packet stream description
- pkt_bld_obj = packet_builder.CTRexPktBuilder()
- pkt_bld_obj.load_from_stream_obj(compiled_stream_obj)
- # generate stream summary based on that
-
- next_stream = "None" if compiled_stream_obj['next_stream_id']==-1 else compiled_stream_obj['next_stream_id']
-
- meta_dict['stream_sum'] = OrderedDict([("id", stream_id),
- ("packet_type", "/".join(pkt_bld_obj.get_packet_layers())),
- ("length", pkt_bld_obj.get_packet_length()),
- ("mode", compiled_stream_obj['mode']['type']),
- ("rate_pps", compiled_stream_obj['mode']['pps']),
- ("next_stream", next_stream)
- ])
- return meta_dict
-
- ################# events handler ######################
- def async_event_port_stopped (self):
- self.state = self.STATE_STREAMS
-
-
- def async_event_port_started (self):
- self.state = self.STATE_TX
-
-
- def async_event_port_paused (self):
- self.state = self.STATE_PAUSE
-
-
- def async_event_port_resumed (self):
- self.state = self.STATE_TX
-
- def async_event_forced_acquired (self):
- self.handler = None
-