Thomas Huth <[email protected]> writes:

> On 04/02/2026 20.51, Peter Xu wrote:
>> On Wed, Feb 04, 2026 at 02:23:32PM -0300, Fabiano Rosas wrote:
>>> Don't implement a custom migration routine at PpcMigrationTest and
>>> instead reuse the generic one from MigrationTest.
>>>
>>> This removes the dependency of PpcMigrationTest from
>>> PseriesMachine. Having one test import another causes unittest code to
>>> instantiate the imported test, resulting in the setup and teardown
>>> methods being invoked for the imported test class, even if no test
>>> from that class will be executed.
>>>
>>> If run in parallel, the extra setup/teardown methods that result from
>>> importing can race with the ones from the actual test being executed
>>> and cause the following error:
>>>
>>> File "<SRC_DIR>/tests/functional/qemu_test/testcase.py", line 238, in 
>>> tearDown
>>> shutil.rmtree(self.workdir)
>>> ...
>>> FileNotFoundError: [Errno 2] No such file or directory:
>>> '<SRC_DIR>/build/tests/functional/ppc64/.../test_migration_with_exec/scratch'
>>>
>>> Fixes: f4e34d0fd5 ("tests/functional: Add a OS level migration test for 
>>> pseries")
>>> Reported-by: Aditya Gupta <[email protected]>
>>> Signed-off-by: Fabiano Rosas <[email protected]>
>>> ---
>>>   tests/functional/migration.py            |  5 +++++
>>>   tests/functional/ppc64/test_migration.py | 11 -----------
>>>   tests/functional/ppc64/test_pseries.py   |  6 ++++--
>>>   3 files changed, 9 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/tests/functional/migration.py b/tests/functional/migration.py
>>> index 49347a30bb..e995328e83 100644
>>> --- a/tests/functional/migration.py
>>> +++ b/tests/functional/migration.py
>>> @@ -65,6 +65,11 @@ def _get_free_port(self, ports):
>>>               self.skipTest('Failed to find a free port')
>>>           return port
>>>   
>>> +    def migration_with_tcp_localhost_vms(self, dst_vm, src_vm):
>>> +        with Ports() as ports:
>>> +            uri = 'tcp:localhost:%u' % self._get_free_port(ports)
>>> +            self.migrate_vms(uri, uri, dst_vm, src_vm)
>>> +
>>>       def migration_with_tcp_localhost(self):
>>>           with Ports() as ports:
>>>               dst_uri = 'tcp:localhost:%u' % self._get_free_port(ports)
>>> diff --git a/tests/functional/ppc64/test_migration.py 
>>> b/tests/functional/ppc64/test_migration.py
>>> index a3b819680b..7d49ee175b 100755
>>> --- a/tests/functional/ppc64/test_migration.py
>>> +++ b/tests/functional/ppc64/test_migration.py
>>> @@ -22,17 +22,6 @@ def test_migration_with_exec(self):
>>>           self.set_machine('mac99')
>>>           self.migration_with_exec()
>>>   
>>> -    def do_migrate_ppc64_linux(self, source_vm, dest_vm):
>>> -        with Ports() as ports:
>>> -            port = ports.find_free_port()
>>> -            if port is None:
>>> -                self.skipTest('Failed to find a free port')
>>> -            uri = 'tcp:localhost:%u' % port
>>> -
>>> -            dest_vm.qmp('migrate-incoming', uri=uri)
>>> -            source_vm.qmp('migrate', uri=uri)
>>> -            self.assert_migration(source_vm, dest_vm)
>>> -
>>>   
>>>   if __name__ == '__main__':
>>>       MigrationTest.main()
>>> diff --git a/tests/functional/ppc64/test_pseries.py 
>>> b/tests/functional/ppc64/test_pseries.py
>>> index b45763c305..3996a4a878 100755
>>> --- a/tests/functional/ppc64/test_pseries.py
>>> +++ b/tests/functional/ppc64/test_pseries.py
>>> @@ -9,7 +9,7 @@
>>>   
>>>   from qemu_test import QemuSystemTest, Asset
>>>   from qemu_test import wait_for_console_pattern
>>> -from test_migration import PpcMigrationTest
>>> +from migration import MigrationTest
>>>   
>>>   class PseriesMachine(QemuSystemTest):
>> 
>> I wonder if PseriesMachine would be better to inherit directly from
>> MigrationTest, to avoid the timeout setup and temp QemuSystemTest to be
>> created on the fly (I'm not familiar with the test framework on side
>> effects).  But I don't see a major issue with it either so far.
>
> I think I'd also prefer to inherit directly from MigrationTest.
> You could put the test_ppc64_linux_migration() method into a separate class 
> that inherits from MigrationTest, while the other test_* methods stay in the 
> old class, so that there is for sure no impact on the other tests.
> (Having multiple test classes in one file is fine, we have that in a couple 
> of other places already).
>

A new class will make it cumbersome to access the class attributes from
PseriesMachine:

    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 console=hvc0 '
    panic_message = 'Kernel panic - not syncing'
    good_message = 'VFS: Cannot open root device'
    ASSET_KERNEL = Asset(...

The "best" way is to make the whole class inherit from MigrationTest. If
you're ok with that I can send a v3.

>   Thomas
>
>
>>>   
>>> @@ -116,7 +116,9 @@ def test_ppc64_linux_migration(self):
>>>           wait_for_console_pattern(self, console_pattern, 
>>> self.panic_message,
>>>                                    vm=source_vm)
>>>   
>>> -        PpcMigrationTest().do_migrate_ppc64_linux(source_vm, dest_vm);
>>> +        mt = MigrationTest()
>>> +        mt.timeout = self.timeout
>>> +        mt.migration_with_tcp_localhost_vms(dest_vm, source_vm);
>>>   
>>>           # ensure the boot proceeds after migration
>>>           wait_for_console_pattern(self, self.good_message, 
>>> self.panic_message,
>>> -- 
>>> 2.51.0
>>>
>> 

Reply via email to