As of today, the current tdc architecture creates one netns and uses it to run all tests. This assumption was embedded into the nsPlugin which carried over as how the tests were written. The tdc tests are by definition self contained and can, theoretically, run in parallel. Even though in the kernel they will serialize over the rtnl lock, we should expect a significant speedup of the total wall time for the entire test suite, which is hitting close to 1100 tests at this point. A first step to achieve this goal is to remove sharing of global resources like veth/dummy interfaces and the netns. In this patch we 'localize' these resources on a per test basis. Each test gets it's own netns, VETH/dummy interfaces. The resources are spawned in the pre_suite phase, where tdc will prepare all netns and interfaces for all tests. This is done in order to avoid concurrency issues with netns / interfaces spawning and commands using them. As tdc progresses, the resources are deleted after each test finishes executing. Tests that don't use the nsPlugin still run under the root namespace, but are now required to manage any external resources like interfaces. These cannot be parallelized as their definition doesn't allow it. On the other hand, when using the nsPlugin, tests don't need to create dummy/veth interfaces as these are handled already. Tested-by: Davide Caratti <dcaratti@redhat.com> Signed-off-by: Pedro Tammela <pctammela@mojatatu.com> Acked-by: Jamal Hadi Salim <jhs@mojatatu.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
74 lines
2.4 KiB
Python
74 lines
2.4 KiB
Python
#!/usr/bin/env python3
|
|
|
|
class TdcPlugin:
|
|
def __init__(self):
|
|
super().__init__()
|
|
print(' -- {}.__init__'.format(self.sub_class))
|
|
|
|
def pre_suite(self, testcount, testlist):
|
|
'''run commands before test_runner goes into a test loop'''
|
|
self.testcount = testcount
|
|
self.testlist = testlist
|
|
if self.args.verbose > 1:
|
|
print(' -- {}.pre_suite'.format(self.sub_class))
|
|
|
|
def post_suite(self, index):
|
|
'''run commands after test_runner completes the test loop
|
|
index is the last ordinal number of test that was attempted'''
|
|
if self.args.verbose > 1:
|
|
print(' -- {}.post_suite'.format(self.sub_class))
|
|
|
|
def pre_case(self, caseinfo, test_skip):
|
|
'''run commands before test_runner does one test'''
|
|
if self.args.verbose > 1:
|
|
print(' -- {}.pre_case'.format(self.sub_class))
|
|
self.args.caseinfo = caseinfo
|
|
self.args.test_skip = test_skip
|
|
|
|
def post_case(self):
|
|
'''run commands after test_runner does one test'''
|
|
if self.args.verbose > 1:
|
|
print(' -- {}.post_case'.format(self.sub_class))
|
|
|
|
def pre_execute(self):
|
|
'''run command before test-runner does the execute step'''
|
|
if self.args.verbose > 1:
|
|
print(' -- {}.pre_execute'.format(self.sub_class))
|
|
|
|
def post_execute(self):
|
|
'''run command after test-runner does the execute step'''
|
|
if self.args.verbose > 1:
|
|
print(' -- {}.post_execute'.format(self.sub_class))
|
|
|
|
def adjust_command(self, stage, command):
|
|
'''adjust the command'''
|
|
if self.args.verbose > 1:
|
|
print(' -- {}.adjust_command {}'.format(self.sub_class, stage))
|
|
|
|
# if stage == 'pre':
|
|
# pass
|
|
# elif stage == 'setup':
|
|
# pass
|
|
# elif stage == 'execute':
|
|
# pass
|
|
# elif stage == 'verify':
|
|
# pass
|
|
# elif stage == 'teardown':
|
|
# pass
|
|
# elif stage == 'post':
|
|
# pass
|
|
# else:
|
|
# pass
|
|
|
|
return command
|
|
|
|
def add_args(self, parser):
|
|
'''Get the plugin args from the command line'''
|
|
self.argparser = parser
|
|
return self.argparser
|
|
|
|
def check_args(self, args, remaining):
|
|
'''Check that the args are set correctly'''
|
|
self.args = args
|
|
if self.args.verbose > 1:
|
|
print(' -- {}.check_args'.format(self.sub_class))
|