Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools: tc-testing: nsPlugin

Move the functionality of creating a namespace before the test suite
and destroying it afterwards to a plugin.

Signed-off-by: Brenda J. Butler <bjb@mojatatu.com>
Acked-by: Lucas Bates <lucasb@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Brenda J. Butler and committed by
David S. Miller
a13fedbe f6926e85

+142 -44
+141
tools/testing/selftests/tc-testing/plugin-lib/nsPlugin.py
··· 1 + import os 2 + import signal 3 + from string import Template 4 + import subprocess 5 + import time 6 + from TdcPlugin import TdcPlugin 7 + 8 + from tdc_config import * 9 + 10 + class SubPlugin(TdcPlugin): 11 + def __init__(self): 12 + self.sub_class = 'ns/SubPlugin' 13 + super().__init__() 14 + 15 + def pre_suite(self, testcount, testidlist): 16 + '''run commands before test_runner goes into a test loop''' 17 + super().pre_suite(testcount, testidlist) 18 + 19 + if self.args.namespace: 20 + self._ns_create() 21 + 22 + def post_suite(self, index): 23 + '''run commands after test_runner goes into a test loop''' 24 + super().post_suite(index) 25 + if self.args.verbose: 26 + print('{}.post_suite'.format(self.sub_class)) 27 + 28 + if self.args.namespace: 29 + self._ns_destroy() 30 + 31 + def add_args(self, parser): 32 + super().add_args(parser) 33 + self.argparser_group = self.argparser.add_argument_group( 34 + 'netns', 35 + 'options for nsPlugin(run commands in net namespace)') 36 + self.argparser_group.add_argument( 37 + '-n', '--namespace', action='store_true', 38 + help='Run commands in namespace') 39 + return self.argparser 40 + 41 + def adjust_command(self, stage, command): 42 + super().adjust_command(stage, command) 43 + cmdform = 'list' 44 + cmdlist = list() 45 + 46 + if not self.args.namespace: 47 + return command 48 + 49 + if self.args.verbose: 50 + print('{}.adjust_command'.format(self.sub_class)) 51 + 52 + if not isinstance(command, list): 53 + cmdform = 'str' 54 + cmdlist = command.split() 55 + else: 56 + cmdlist = command 57 + if stage == 'setup' or stage == 'execute' or stage == 'verify' or stage == 'teardown': 58 + if self.args.verbose: 59 + print('adjust_command: stage is {}; inserting netns stuff in command [{}] list [{}]'.format(stage, command, cmdlist)) 60 + cmdlist.insert(0, self.args.NAMES['NS']) 61 + cmdlist.insert(0, 'exec') 62 + cmdlist.insert(0, 'netns') 63 + cmdlist.insert(0, 'ip') 64 + else: 65 + pass 66 + 67 + if cmdform == 'str': 68 + command = ' '.join(cmdlist) 69 + else: 70 + command = cmdlist 71 + 72 + if self.args.verbose: 73 + print('adjust_command: return command [{}]'.format(command)) 74 + return command 75 + 76 + def _ns_create(self): 77 + ''' 78 + Create the network namespace in which the tests will be run and set up 79 + the required network devices for it. 80 + ''' 81 + if self.args.namespace: 82 + cmd = 'ip netns add {}'.format(self.args.NAMES['NS']) 83 + self._exec_cmd('pre', cmd) 84 + cmd = 'ip link add $DEV0 type veth peer name $DEV1' 85 + self._exec_cmd('pre', cmd) 86 + cmd = 'ip link set $DEV1 netns {}'.format(self.args.NAMES['NS']) 87 + self._exec_cmd('pre', cmd) 88 + cmd = 'ip link set $DEV0 up' 89 + self._exec_cmd('pre', cmd) 90 + cmd = 'ip -n {} link set $DEV1 up'.format(self.args.NAMES['NS']) 91 + self._exec_cmd('pre', cmd) 92 + if self.args.device: 93 + cmd = 'ip link set $DEV2 netns {}'.format(self.args.NAMES['NS']) 94 + self._exec_cmd('pre', cmd) 95 + cmd = 'ip -n {} link set $DEV2 up'.format(self.args.NAMES['NS']) 96 + self._exec_cmd('pre', cmd) 97 + 98 + def _ns_destroy(self): 99 + ''' 100 + Destroy the network namespace for testing (and any associated network 101 + devices as well) 102 + ''' 103 + if self.args.namespace: 104 + cmd = 'ip netns delete {}'.format(self.args.NAMES['NS']) 105 + self._exec_cmd('post', cmd) 106 + 107 + def _exec_cmd(self, stage, command): 108 + ''' 109 + Perform any required modifications on an executable command, then run 110 + it in a subprocess and return the results. 111 + ''' 112 + if '$' in command: 113 + command = self._replace_keywords(command) 114 + 115 + self.adjust_command(stage, command) 116 + if self.args.verbose: 117 + print('_exec_cmd: command "{}"'.format(command)) 118 + proc = subprocess.Popen(command, 119 + shell=True, 120 + stdout=subprocess.PIPE, 121 + stderr=subprocess.PIPE, 122 + env=ENVIR) 123 + (rawout, serr) = proc.communicate() 124 + 125 + if proc.returncode != 0 and len(serr) > 0: 126 + foutput = serr.decode("utf-8") 127 + else: 128 + foutput = rawout.decode("utf-8") 129 + 130 + proc.stdout.close() 131 + proc.stderr.close() 132 + return proc, foutput 133 + 134 + def _replace_keywords(self, cmd): 135 + """ 136 + For a given executable command, substitute any known 137 + variables contained within NAMES with the correct values 138 + """ 139 + tcmd = Template(cmd) 140 + subcmd = tcmd.safe_substitute(self.args.NAMES) 141 + return subcmd
+1 -44
tools/testing/selftests/tc-testing/tdc.py
··· 23 23 24 24 import TdcPlugin 25 25 26 - USE_NS = True 27 - 28 26 class PluginMgr: 29 27 def __init__(self, argparser): 30 28 super().__init__() ··· 105 107 return subcmd 106 108 107 109 108 - def exec_cmd(args, pm, stage, command, nsonly=True): 110 + def exec_cmd(args, pm, stage, command): 109 111 """ 110 112 Perform any required modifications on an executable command, then run 111 113 it in a subprocess and return the results. 112 114 """ 113 115 if len(command.strip()) == 0: 114 116 return None, None 115 - if (USE_NS and nsonly): 116 - command = 'ip netns exec $NS ' + command 117 - 118 117 if '$' in command: 119 118 command = replace_keywords(command) 120 119 ··· 259 264 pm.call_post_suite(index) 260 265 261 266 return tap 262 - 263 - 264 - def ns_create(args, pm): 265 - """ 266 - Create the network namespace in which the tests will be run and set up 267 - the required network devices for it. 268 - """ 269 - if (USE_NS): 270 - cmd = 'ip netns add $NS' 271 - exec_cmd(args, pm, 'pre', cmd, False) 272 - cmd = 'ip link add $DEV0 type veth peer name $DEV1' 273 - exec_cmd(args, pm, 'pre', cmd, False) 274 - cmd = 'ip link set $DEV1 netns $NS' 275 - exec_cmd(args, pm, 'pre', cmd, False) 276 - cmd = 'ip link set $DEV0 up' 277 - exec_cmd(args, pm, 'pre', cmd, False) 278 - cmd = 'ip -n $NS link set $DEV1 up' 279 - exec_cmd(args, pm, 'pre', cmd, False) 280 - cmd = 'ip link set $DEV2 netns $NS' 281 - exec_cmd(args, pm, 'pre', cmd, False) 282 - cmd = 'ip -n $NS link set $DEV2 up' 283 - exec_cmd(args, pm, 'pre', cmd, False) 284 - 285 - 286 - def ns_destroy(args, pm): 287 - """ 288 - Destroy the network namespace for testing (and any associated network 289 - devices as well) 290 - """ 291 - if (USE_NS): 292 - cmd = 'ip netns delete $NS' 293 - exec_cmd(args, pm, 'post', cmd, False) 294 - 295 267 296 268 def has_blank_ids(idlist): 297 269 """ ··· 541 579 list_test_cases(alltests) 542 580 exit(0) 543 581 544 - ns_create(args, pm) 545 - 546 582 if len(alltests): 547 583 catresults = test_runner(pm, args, alltests) 548 584 else: 549 585 catresults = 'No tests found\n' 550 586 print('All test results: \n\n{}'.format(catresults)) 551 - 552 - ns_destroy(args, pm) 553 - 554 587 555 588 def main(): 556 589 """