Hi All,

This is a proposal to abstract all the setups, test run,
post test validation, cleanup of the tests from tp-libvirt/tp-qemu
into avocado-vt so that we have one unique testcase source code
and existing test config can grow based on the new scenarios/variants.

>From testconfig we could pass following params,

`test_class` - Actual functionality test
`pre_events` - integrate any other events or test before actual test
`post_events`- integrate any other events or test after actual test

Test case file source can be like below common for all the tests,

def run(test, params, env):
    """
    Test KVM scenarios
    """
    try:
        test_class = eval(params.get("test_class"))
        pre_events = params.get("test_pre_events").split()
        post_events = params.get("test_post_events").split()
        vms = env.get_all_vms()
        try:
            for each in pre_events:
                preevent = eval(each)
                preevent_obj = preevent(vms, params)
                preevent_obj.run()
            test_obj = test_class(vms, params)
            test_obj.run()
            for each in post_events:
                postevent = eval(each)
                postevent_obj = postevent(vms, params)
                postevent_obj.run()
        except Exception as info:
            test.fail(info)
        finally:
            if preevent_obj:
                preevent_obj.cleanup()
            if test_obj:
                test_obj.cleanup()
            if postevent:
                postevent_obj.cleanup()
    except NameError as info:
        test.error(info)

Avocado-VT should have class for each functionality test or events 

class TestClass(object):
    def __init__(self, vms, params):
        self.vms = vms
        self.params = params

    # perform pre test setup
    def setup(self):
    def run(self):
        self.setup()
        # code that performs actual test
        self.validation
    # perform post test validation
    def validation(self):
    def cleanup():

As example we can take migration test,
One of the test performs CPU hotplug before migration, perform migration
and CPU hotunplug after migration

* preevent will be CPU hotplug Test
* test_class will be Migration Test
* postevent will be CPU hotunplug Test

We can control the preevent or postevent from params,

1. require it or not (migration with/without any events)
2. require same no of multiple events before/after test (hotplug event
   before migration and hotunplug event after migration)
3. require variable no of multiple events before/after test (hotplug
   event, stress event before and hotunplug event after migration)

By this design,

* Single testcase source for all the functional tests.
* All the functional code abstracted to Avocado-VT into its own class
  for each features respectively.
* Avoids all the duplicate named params for every test introduced and
  similar logics that reduces the code bloat in Autotest and Avocado-VT.
* Make almost all the attributes configurable from params.
* New testcases can be generated dynamically from avocado commandline by
  giving different param values using --vt-extra-params,

  Example: we can change no of cpus to be hotplugged/hotunplugged while
           triggering the test from avocado command line instead of writing new
           testcase for it.

Initially it would take effort to refactor Avocado-VT to adopt it but,
I think it will greatly change the way we can test going forward and
make the framework more simple, powerful and robost.

Please share your thoughts on it, I can make a working model based on
the feedback and comments on the proposal.

-- Bala

Reply via email to