python: create qemu packages
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>
This commit is contained in:
parent
7f0a143b0c
commit
beb6b57b3b
@ -1,11 +0,0 @@
|
|||||||
# QEMU library
|
|
||||||
#
|
|
||||||
# Copyright (C) 2015-2016 Red Hat Inc.
|
|
||||||
# Copyright (C) 2012 IBM Corp.
|
|
||||||
#
|
|
||||||
# Authors:
|
|
||||||
# Fam Zheng <famz@redhat.com>
|
|
||||||
#
|
|
||||||
# This work is licensed under the terms of the GNU GPL, version 2. See
|
|
||||||
# the COPYING file in the top-level directory.
|
|
||||||
#
|
|
33
python/qemu/machine/__init__.py
Normal file
33
python/qemu/machine/__init__.py
Normal file
@ -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',
|
||||||
|
)
|
@ -38,8 +38,14 @@ from typing import (
|
|||||||
Type,
|
Type,
|
||||||
)
|
)
|
||||||
|
|
||||||
from . import console_socket, qmp
|
from qemu.qmp import (
|
||||||
from .qmp import QMPMessage, QMPReturnValue, SocketAddrT
|
QEMUMonitorProtocol,
|
||||||
|
QMPMessage,
|
||||||
|
QMPReturnValue,
|
||||||
|
SocketAddrT,
|
||||||
|
)
|
||||||
|
|
||||||
|
from . import console_socket
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
@ -139,7 +145,7 @@ class QEMUMachine:
|
|||||||
self._events: List[QMPMessage] = []
|
self._events: List[QMPMessage] = []
|
||||||
self._iolog: Optional[str] = None
|
self._iolog: Optional[str] = None
|
||||||
self._qmp_set = True # Enable QMP monitor by default.
|
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._qemu_full_args: Tuple[str, ...] = ()
|
||||||
self._temp_dir: Optional[str] = None
|
self._temp_dir: Optional[str] = None
|
||||||
self._launched = False
|
self._launched = False
|
||||||
@ -314,7 +320,7 @@ class QEMUMachine:
|
|||||||
if self._remove_monitor_sockfile:
|
if self._remove_monitor_sockfile:
|
||||||
assert isinstance(self._monitor_address, str)
|
assert isinstance(self._monitor_address, str)
|
||||||
self._remove_files.append(self._monitor_address)
|
self._remove_files.append(self._monitor_address)
|
||||||
self._qmp_connection = qmp.QEMUMonitorProtocol(
|
self._qmp_connection = QEMUMonitorProtocol(
|
||||||
self._monitor_address,
|
self._monitor_address,
|
||||||
server=True,
|
server=True,
|
||||||
nickname=self._name
|
nickname=self._name
|
||||||
@ -541,7 +547,7 @@ class QEMUMachine:
|
|||||||
self._qmp_set = enabled
|
self._qmp_set = enabled
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _qmp(self) -> qmp.QEMUMonitorProtocol:
|
def _qmp(self) -> QEMUMonitorProtocol:
|
||||||
if self._qmp_connection is None:
|
if self._qmp_connection is None:
|
||||||
raise QEMUMachineError("Attempt to access QMP with no connection")
|
raise QEMUMachineError("Attempt to access QMP with no connection")
|
||||||
return self._qmp_connection
|
return self._qmp_connection
|
@ -26,8 +26,9 @@ from typing import (
|
|||||||
TextIO,
|
TextIO,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from qemu.qmp import SocketAddrT
|
||||||
|
|
||||||
from .machine import QEMUMachine
|
from .machine import QEMUMachine
|
||||||
from .qmp import SocketAddrT
|
|
||||||
|
|
||||||
|
|
||||||
class QEMUQtestProtocol:
|
class QEMUQtestProtocol:
|
@ -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.
|
# Copyright (C) 2009, 2010 Red Hat Inc.
|
||||||
#
|
#
|
||||||
# Authors:
|
# Authors:
|
@ -1,13 +1,14 @@
|
|||||||
"""
|
"""
|
||||||
QEMU utility library
|
QEMU development and testing utilities
|
||||||
|
|
||||||
This offers miscellaneous utility functions, which may not be easily
|
This package provides a small handful of utilities for performing
|
||||||
distinguishable or numerous to be in their own module.
|
various tasks not directly related to the launching of a VM.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Copyright (C) 2021 Red Hat Inc.
|
# Copyright (C) 2021 Red Hat Inc.
|
||||||
#
|
#
|
||||||
# Authors:
|
# Authors:
|
||||||
|
# John Snow <jsnow@redhat.com>
|
||||||
# Cleber Rosa <crosa@redhat.com>
|
# Cleber Rosa <crosa@redhat.com>
|
||||||
#
|
#
|
||||||
# This work is licensed under the terms of the GNU GPL, version 2. See
|
# This work is licensed under the terms of the GNU GPL, version 2. See
|
||||||
@ -17,6 +18,17 @@ distinguishable or numerous to be in their own module.
|
|||||||
import re
|
import re
|
||||||
from typing import Optional
|
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]:
|
def get_info_usernet_hostfwd_port(info_usernet_output: str) -> Optional[int]:
|
||||||
"""
|
"""
|
@ -41,11 +41,12 @@ else:
|
|||||||
|
|
||||||
sys.path.append(os.path.join(SOURCE_DIR, 'python'))
|
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.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):
|
def is_readable_executable_file(path):
|
||||||
return os.path.isfile(path) and os.access(path, os.R_OK | os.X_OK)
|
return os.path.isfile(path) and os.access(path, os.R_OK | os.X_OK)
|
||||||
|
@ -10,7 +10,7 @@ from avocado_qemu import wait_for_console_pattern
|
|||||||
from avocado_qemu import exec_command_and_wait_for_pattern
|
from avocado_qemu import exec_command_and_wait_for_pattern
|
||||||
from avocado_qemu import is_readable_executable_file
|
from avocado_qemu import is_readable_executable_file
|
||||||
|
|
||||||
from qemu.accel import kvm_available
|
from qemu.utils import kvm_available
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
|
@ -28,7 +28,7 @@ import iotests
|
|||||||
|
|
||||||
# Import qemu after iotests.py has amended sys.path
|
# Import qemu after iotests.py has amended sys.path
|
||||||
# pylint: disable=wrong-import-order
|
# pylint: disable=wrong-import-order
|
||||||
import qemu
|
from qemu.machine import machine
|
||||||
|
|
||||||
BlockBitmapMapping = List[Dict[str, object]]
|
BlockBitmapMapping = List[Dict[str, object]]
|
||||||
|
|
||||||
@ -466,7 +466,7 @@ class TestBlockBitmapMappingErrors(TestDirtyBitmapMigration):
|
|||||||
# the failed migration
|
# the failed migration
|
||||||
try:
|
try:
|
||||||
self.vm_b.shutdown()
|
self.vm_b.shutdown()
|
||||||
except qemu.machine.AbnormalShutdown:
|
except machine.AbnormalShutdown:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def test_aliased_bitmap_name_too_long(self) -> None:
|
def test_aliased_bitmap_name_too_long(self) -> None:
|
||||||
|
@ -38,7 +38,7 @@ from contextlib import contextmanager
|
|||||||
|
|
||||||
# pylint: disable=import-error, wrong-import-position
|
# pylint: disable=import-error, wrong-import-position
|
||||||
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
|
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
|
from qemu.qmp import QMPMessage
|
||||||
|
|
||||||
# Use this logger for logging messages directly from the iotests module
|
# Use this logger for logging messages directly from the iotests module
|
||||||
|
@ -14,7 +14,7 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
import basevm
|
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 is the config needed for current version of QEMU.
|
||||||
# This works for both kvm and tcg.
|
# This works for both kvm and tcg.
|
||||||
|
@ -19,9 +19,8 @@ import logging
|
|||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
|
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
|
||||||
from qemu.accel import kvm_available
|
|
||||||
from qemu.machine import QEMUMachine
|
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 subprocess
|
||||||
import hashlib
|
import hashlib
|
||||||
import argparse
|
import argparse
|
||||||
|
Loading…
Reference in New Issue
Block a user