diff options
author | Yaroslav Brustinov <ybrustin@cisco.com> | 2016-09-30 12:52:29 +0300 |
---|---|---|
committer | Yaroslav Brustinov <ybrustin@cisco.com> | 2016-09-30 12:55:16 +0300 |
commit | 5591bec0425ea906feb109a1142eca66ac1ce937 (patch) | |
tree | c7229138821cd26d6881c2dad63c84702a3869f9 /scripts/automation | |
parent | 2e02d8cb37b98794d2d280f0cdc817752f051e5f (diff) |
fix parsing tunables, add support for separate -t in console, add benchmark profile
Diffstat (limited to 'scripts/automation')
-rwxr-xr-x | scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py | 30 | ||||
-rwxr-xr-x | scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py | 38 |
2 files changed, 40 insertions, 28 deletions
diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py index 2d7cb269..82aa932d 100755 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py @@ -837,7 +837,7 @@ class STLClient(object): if not rc: return rc - self.supported_cmds = rc.data() + self.supported_cmds = sorted(rc.data()) # create ports for port_id in range(self.system_info["port_count"]): @@ -2831,26 +2831,12 @@ class STLClient(object): else: self.stop(active_ports) - - # default value for tunables (empty) - tunables = [{}] * len(opts.ports) # process tunables - if opts.tunables: - - # for one tunable - duplicate for all ports - if len(opts.tunables) == 1: - tunables = opts.tunables * len(opts.ports) - - else: - # must be exact - if len(opts.ports) != len(opts.tunables): - msg = 'tunables section count must be 1 or exactly as the number of ports: got {0}'.format(len(opts.tunables)) - self.logger.log(msg) - return RC_ERR(msg) - - tunables = opts.tunables - + if type(opts.tunables) is dict: + tunables = opts.tunables + else: + tunables = {} # remove all streams @@ -2858,12 +2844,12 @@ class STLClient(object): # pack the profile try: - for port, t in zip(opts.ports, tunables): + for port in opts.ports: profile = STLProfile.load(opts.file[0], - direction = t.get('direction', port % 2), + direction = tunables.get('direction', port % 2), port_id = port, - **t) + **tunables) self.add_streams(profile.get_streams(), ports = port) diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py index b42b56af..8ae86981 100755 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py @@ -217,15 +217,28 @@ def is_valid_file(filename): def decode_tunables (tunable_str): tunables = {} - # split by diaz to tokens - tokens = tunable_str.split('#') + # split by comma to tokens + tokens = tunable_str.split(',') # each token is of form X=Y for token in tokens: - m = re.search('(.*)=(.*)', token) + m = re.search('(\S+)=(.+)', token) if not m: raise argparse.ArgumentTypeError("bad syntax for tunables: {0}".format(token)) - tunables[m.group(1)] = m.group(2) + val = m.group(2) # string + if val.startswith(("'", '"')) and val.endswith(("'", '"')) and len(val) > 1: # need to remove the quotes from value + val = val[1:-1] + elif val.startswith('0x'): # hex + val = int(val, 16) + else: + try: + if '.' in val: # float + val = float(val) + else: # int + val = int(val) + except: + pass + tunables[m.group(1)] = val return tunables @@ -279,9 +292,10 @@ OPTIONS_DB = {MULTIPLIER: ArgumentPack(['-m', '--multiplier'], 'metavar': 'T1=VAL[,T2=VAL ...]', 'dest': "tunables", 'default': None, + 'action': 'merge', 'type': decode_tunables}), - NO_PROMISCUOUS: ArgumentPack(['--no_prom'], + NO_PROMISCUOUS: ArgumentPack(['--no-prom', '--no_prom'], {'help': "Sets port promiscuous off", 'dest': "prom", 'default': None, @@ -291,6 +305,7 @@ OPTIONS_DB = {MULTIPLIER: ArgumentPack(['-m', '--multiplier'], {"nargs": '+', 'dest':'ports', 'metavar': 'PORTS', + 'action': 'merge', 'type': int, 'help': "A list of ports on which to apply the command", 'default': []}), @@ -438,6 +453,17 @@ OPTIONS_DB = {MULTIPLIER: ArgumentPack(['-m', '--multiplier'], } +class _MergeAction(argparse._AppendAction): + def __call__(self, parser, namespace, values, option_string=None): + items = getattr(namespace, self.dest) + if not items: + items = values + elif type(items) is list and type(values) is list: + items.extend(values) + elif type(items) is dict and type(values) is dict: # tunables are dict + items.update(values) + + setattr(namespace, self.dest, items) class CCmdArgParser(argparse.ArgumentParser): @@ -445,7 +471,7 @@ class CCmdArgParser(argparse.ArgumentParser): super(CCmdArgParser, self).__init__(*args, **kwargs) self.stateless_client = stateless_client self.cmd_name = kwargs.get('prog') - + self.register('action', 'merge', _MergeAction) # hook this to the logger def _print_message(self, message, file=None): |