Skip to content

Commit

Permalink
python: create qemu packages
Browse files Browse the repository at this point in the history
move python/qemu/*.py to python/qemu/[machine, qmp, utils]/*.py and
update import directives across the tree.

This is done to create a PEP420 namespace package, in which we may
create subpackages. To do this, the namespace directory ("qemu") should
not have any modules in it. Those files will go into new 'machine',
'qmp' and 'utils' subpackages instead.

Implement machine/__init__.py making the top-level classes and functions
from its various modules available directly inside the package. Change
qmp.py to qmp/__init__.py similarly, such that all of the useful QMP
library classes are available directly from "qemu.qmp" instead of
"qemu.qmp.qmp".

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Cleber Rosa <crosa@redhat.com>
Message-id: 20210527211715.394144-10-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
  • Loading branch information
jnsnow committed Jun 1, 2021
1 parent 7f0a143 commit beb6b57
Show file tree
Hide file tree
Showing 17 changed files with 83 additions and 32 deletions.
File renamed without changes.
11 changes: 0 additions & 11 deletions python/qemu/__init__.py

This file was deleted.

File renamed without changes.
33 changes: 33 additions & 0 deletions python/qemu/machine/__init__.py
@@ -0,0 +1,33 @@
"""
QEMU development and testing library.
This library provides a few high-level classes for driving QEMU from a
test suite, not intended for production use.
- QEMUMachine: Configure and Boot a QEMU VM
- QEMUQtestMachine: VM class, with a qtest socket.
- QEMUQtestProtocol: Connect to, send/receive qtest messages.
"""

# Copyright (C) 2020-2021 John Snow for Red Hat Inc.
# Copyright (C) 2015-2016 Red Hat Inc.
# Copyright (C) 2012 IBM Corp.
#
# Authors:
# John Snow <jsnow@redhat.com>
# Fam Zheng <fam@euphon.net>
#
# This work is licensed under the terms of the GNU GPL, version 2. See
# the COPYING file in the top-level directory.
#

from .machine import QEMUMachine
from .qtest import QEMUQtestMachine, QEMUQtestProtocol


__all__ = (
'QEMUMachine',
'QEMUQtestProtocol',
'QEMUQtestMachine',
)
File renamed without changes.
16 changes: 11 additions & 5 deletions python/qemu/machine.py → python/qemu/machine/machine.py
Expand Up @@ -38,8 +38,14 @@
Type,
)

from . import console_socket, qmp
from .qmp import QMPMessage, QMPReturnValue, SocketAddrT
from qemu.qmp import (
QEMUMonitorProtocol,
QMPMessage,
QMPReturnValue,
SocketAddrT,
)

from . import console_socket


LOG = logging.getLogger(__name__)
Expand Down Expand Up @@ -139,7 +145,7 @@ def __init__(self,
self._events: List[QMPMessage] = []
self._iolog: Optional[str] = None
self._qmp_set = True # Enable QMP monitor by default.
self._qmp_connection: Optional[qmp.QEMUMonitorProtocol] = None
self._qmp_connection: Optional[QEMUMonitorProtocol] = None
self._qemu_full_args: Tuple[str, ...] = ()
self._temp_dir: Optional[str] = None
self._launched = False
Expand Down Expand Up @@ -314,7 +320,7 @@ def _pre_launch(self) -> None:
if self._remove_monitor_sockfile:
assert isinstance(self._monitor_address, str)
self._remove_files.append(self._monitor_address)
self._qmp_connection = qmp.QEMUMonitorProtocol(
self._qmp_connection = QEMUMonitorProtocol(
self._monitor_address,
server=True,
nickname=self._name
Expand Down Expand Up @@ -541,7 +547,7 @@ def set_qmp_monitor(self, enabled: bool = True) -> None:
self._qmp_set = enabled

@property
def _qmp(self) -> qmp.QEMUMonitorProtocol:
def _qmp(self) -> QEMUMonitorProtocol:
if self._qmp_connection is None:
raise QEMUMachineError("Attempt to access QMP with no connection")
return self._qmp_connection
Expand Down
File renamed without changes.
3 changes: 2 additions & 1 deletion python/qemu/qtest.py → python/qemu/machine/qtest.py
Expand Up @@ -26,8 +26,9 @@
TextIO,
)

from qemu.qmp import SocketAddrT

from .machine import QEMUMachine
from .qmp import SocketAddrT


class QEMUQtestProtocol:
Expand Down
12 changes: 11 additions & 1 deletion python/qemu/qmp.py → python/qemu/qmp/__init__.py
@@ -1,4 +1,14 @@
""" QEMU Monitor Protocol Python class """
"""
QEMU Monitor Protocol (QMP) development library & tooling.
This package provides a fairly low-level class for communicating to QMP
protocol servers, as implemented by QEMU, the QEMU Guest Agent, and the
QEMU Storage Daemon. This library is not intended for production use.
`QEMUMonitorProtocol` is the primary class of interest, and all errors
raised derive from `QMPError`.
"""

# Copyright (C) 2009, 2010 Red Hat Inc.
#
# Authors:
Expand Down
18 changes: 15 additions & 3 deletions python/qemu/utils.py → python/qemu/utils/__init__.py
@@ -1,13 +1,14 @@
"""
QEMU utility library
QEMU development and testing utilities
This offers miscellaneous utility functions, which may not be easily
distinguishable or numerous to be in their own module.
This package provides a small handful of utilities for performing
various tasks not directly related to the launching of a VM.
"""

# Copyright (C) 2021 Red Hat Inc.
#
# Authors:
# John Snow <jsnow@redhat.com>
# Cleber Rosa <crosa@redhat.com>
#
# This work is licensed under the terms of the GNU GPL, version 2. See
Expand All @@ -17,6 +18,17 @@
import re
from typing import Optional

# pylint: disable=import-error
from .accel import kvm_available, list_accel, tcg_available


__all__ = (
'get_info_usernet_hostfwd_port',
'kvm_available',
'list_accel',
'tcg_available',
)


def get_info_usernet_hostfwd_port(info_usernet_output: str) -> Optional[int]:
"""
Expand Down
File renamed without changes.
9 changes: 5 additions & 4 deletions tests/acceptance/avocado_qemu/__init__.py
Expand Up @@ -41,11 +41,12 @@

sys.path.append(os.path.join(SOURCE_DIR, 'python'))

from qemu.accel import kvm_available
from qemu.accel import tcg_available
from qemu.machine import QEMUMachine
from qemu.utils import get_info_usernet_hostfwd_port

from qemu.utils import (
get_info_usernet_hostfwd_port,
kvm_available,
tcg_available,
)

def is_readable_executable_file(path):
return os.path.isfile(path) and os.access(path, os.R_OK | os.X_OK)
Expand Down
2 changes: 1 addition & 1 deletion tests/acceptance/virtio-gpu.py
Expand Up @@ -10,7 +10,7 @@
from avocado_qemu import exec_command_and_wait_for_pattern
from avocado_qemu import is_readable_executable_file

from qemu.accel import kvm_available
from qemu.utils import kvm_available

import os
import socket
Expand Down
4 changes: 2 additions & 2 deletions tests/qemu-iotests/300
Expand Up @@ -28,7 +28,7 @@ import iotests

# Import qemu after iotests.py has amended sys.path
# pylint: disable=wrong-import-order
import qemu
from qemu.machine import machine

BlockBitmapMapping = List[Dict[str, object]]

Expand Down Expand Up @@ -466,7 +466,7 @@ class TestBlockBitmapMappingErrors(TestDirtyBitmapMigration):
# the failed migration
try:
self.vm_b.shutdown()
except qemu.machine.AbnormalShutdown:
except machine.AbnormalShutdown:
pass

def test_aliased_bitmap_name_too_long(self) -> None:
Expand Down
2 changes: 1 addition & 1 deletion tests/qemu-iotests/iotests.py
Expand Up @@ -38,7 +38,7 @@

# pylint: disable=import-error, wrong-import-position
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
from qemu import qtest
from qemu.machine import qtest
from qemu.qmp import QMPMessage

# Use this logger for logging messages directly from the iotests module
Expand Down
2 changes: 1 addition & 1 deletion tests/vm/aarch64vm.py
Expand Up @@ -14,7 +14,7 @@
import sys
import subprocess
import basevm
from qemu.accel import kvm_available
from qemu.utils import kvm_available

# This is the config needed for current version of QEMU.
# This works for both kvm and tcg.
Expand Down
3 changes: 1 addition & 2 deletions tests/vm/basevm.py
Expand Up @@ -19,9 +19,8 @@
import time
import datetime
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
from qemu.accel import kvm_available
from qemu.machine import QEMUMachine
from qemu.utils import get_info_usernet_hostfwd_port
from qemu.utils import get_info_usernet_hostfwd_port, kvm_available
import subprocess
import hashlib
import argparse
Expand Down

0 comments on commit beb6b57

Please sign in to comment.