Skip to content

Commit

Permalink
Revert "tests: Use separate virtual environment for avocado"
Browse files Browse the repository at this point in the history
This reverts commit e8e4298.

ensuregroup allows to specify both the acceptable versions of avocado,
and a locked version to be used when avocado is not installed as a system
pacakge.  This lets us install avocado in pyvenv/ using "mkvenv.py" and
reuse the distro package on Fedora and CentOS Stream (the only distros
where it's available).

ensuregroup's usage of "(>=..., <=...)" constraints when evaluating
the distro package, and "==" constraints when installing it from PyPI,
makes it possible to avoid conflicts between the known-good version and
a package plugins included in the distro.

This is because package plugins have "==" constraints on the version
that is included in the distro, and, using "pip install avocado==88.1"
on a venv that includes system packages will result in an error:

   avocado-framework-plugin-varianter-yaml-to-mux 98.0 requires avocado-framework==98.0, but you have avocado-framework 88.1 which is incompatible.
   avocado-framework-plugin-result-html 98.0 requires avocado-framework==98.0, but you have avocado-framework 88.1 which is incompatible.

But at the same time, if the venv does not include a system distribution
of avocado then we can install a known-good version and stick to LTS
releases.

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1663
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
bonzini committed Aug 28, 2023
1 parent c853c4d commit c03f57f
Show file tree
Hide file tree
Showing 10 changed files with 37 additions and 42 deletions.
6 changes: 3 additions & 3 deletions .gitlab-ci.d/buildtest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ crash-test-debian:
script:
- cd build
- make NINJA=":" check-venv
- tests/venv/bin/python3 scripts/device-crash-test -q --tcg-only ./qemu-system-i386
- pyvenv/bin/python3 scripts/device-crash-test -q --tcg-only ./qemu-system-i386

build-system-fedora:
extends:
Expand Down Expand Up @@ -146,8 +146,8 @@ crash-test-fedora:
script:
- cd build
- make NINJA=":" check-venv
- tests/venv/bin/python3 scripts/device-crash-test -q ./qemu-system-ppc
- tests/venv/bin/python3 scripts/device-crash-test -q ./qemu-system-riscv32
- pyvenv/bin/python3 scripts/device-crash-test -q ./qemu-system-ppc
- pyvenv/bin/python3 scripts/device-crash-test -q ./qemu-system-riscv32

build-system-centos:
extends:
Expand Down
6 changes: 3 additions & 3 deletions docs/devel/acpi-bits.rst
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,19 @@ Under ``tests/avocado/`` as the root we have:
::

$ make check-venv (needed only the first time to create the venv)
$ ./tests/venv/bin/avocado run -t acpi tests/avocado
$ ./pyvenv/bin/avocado run -t acpi tests/avocado

The above will run all acpi avocado tests including this one.
In order to run the individual tests, perform the following:
::

$ ./tests/venv/bin/avocado run tests/avocado/acpi-bits.py --tap -
$ ./pyvenv/bin/avocado run tests/avocado/acpi-bits.py --tap -

The above will produce output in tap format. You can omit "--tap -" in the
end and it will produce output like the following:
::

$ ./tests/venv/bin/avocado run tests/avocado/acpi-bits.py
$ ./pyvenv/bin/avocado run tests/avocado/acpi-bits.py
Fetching asset from tests/avocado/acpi-bits.py:AcpiBitsTest.test_acpi_smbios_bits
JOB ID : eab225724da7b64c012c65705dc2fa14ab1defef
JOB LOG : /home/anisinha/avocado/job-results/job-2022-10-10T17.58-eab2257/job.log
Expand Down
14 changes: 7 additions & 7 deletions docs/devel/testing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -894,9 +894,9 @@ You can run the avocado tests simply by executing:
make check-avocado
This involves the automatic creation of Python virtual environment
within the build tree (at ``tests/venv``) which will have all the
right dependencies, and will save tests results also within the
This involves the automatic installation, from PyPI, of all the
necessary avocado-framework dependencies into the QEMU venv within the
build tree (at ``./pyvenv``). Test results are also saved within the
build tree (at ``tests/results``).

Note: the build environment must be using a Python 3 stack, and have
Expand Down Expand Up @@ -953,7 +953,7 @@ may be invoked by running:

.. code::
tests/venv/bin/avocado run $OPTION1 $OPTION2 tests/avocado/
pyvenv/bin/avocado run $OPTION1 $OPTION2 tests/avocado/
Note that if ``make check-avocado`` was not executed before, it is
possible to create the Python virtual environment with the dependencies
Expand All @@ -968,20 +968,20 @@ a test file. To run tests from a single file within the build tree, use:

.. code::
tests/venv/bin/avocado run tests/avocado/$TESTFILE
pyvenv/bin/avocado run tests/avocado/$TESTFILE
To run a single test within a test file, use:

.. code::
tests/venv/bin/avocado run tests/avocado/$TESTFILE:$TESTCLASS.$TESTNAME
pyvenv/bin/avocado run tests/avocado/$TESTFILE:$TESTCLASS.$TESTNAME
Valid test names are visible in the output from any previous execution
of Avocado or ``make check-avocado``, and can also be queried using:

.. code::
tests/venv/bin/avocado list tests/avocado
pyvenv/bin/avocado list tests/avocado
Manual Installation
~~~~~~~~~~~~~~~~~~~
Expand Down
13 changes: 5 additions & 8 deletions python/scripts/mkvenv.py
Original file line number Diff line number Diff line change
Expand Up @@ -964,14 +964,11 @@ def _parse_groups(file: str) -> Dict[str, Dict[str, Any]]:
"Python >=3.11 does not have tomllib... what have you done!?"
)

try:
# Use loads() to support both tomli v1.2.x (Ubuntu 22.04,
# Debian bullseye-backports) and v2.0.x
with open(file, "r", encoding="ascii") as depfile:
contents = depfile.read()
return tomllib.loads(contents) # type: ignore
except tomllib.TOMLDecodeError as exc:
raise Ouch(f"parsing {file} failed: {exc}") from exc
# Use loads() to support both tomli v1.2.x (Ubuntu 22.04,
# Debian bullseye-backports) and v2.0.x
with open(file, "r", encoding="ascii") as depfile:
contents = depfile.read()
return tomllib.loads(contents) # type: ignore


def ensure_group(
Expand Down
7 changes: 7 additions & 0 deletions pythondeps.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,10 @@ meson = { accepted = ">=0.63.0", installed = "0.63.3", canary = "meson" }
[docs]
sphinx = { accepted = ">=1.6", installed = "5.3.0", canary = "sphinx-build" }
sphinx_rtd_theme = { accepted = ">=0.5", installed = "1.1.1" }

[avocado]
# Note that qemu.git/python/ is always implicitly installed.
# Prefer an LTS version when updating the accepted versions of
# avocado-framework, for example right now the limit is 92.x.
avocado-framework = { accepted = "(>=88.1, <93.0)", installed = "88.1", canary = "avocado" }
pycdlib = { accepted = ">=1.11.0" }
4 changes: 2 additions & 2 deletions scripts/ci/org.centos/stream/8/x86_64/test-avocado
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# KVM and x86_64, or tests that are generic enough to be valid for all
# targets. Such a test list can be generated with:
#
# ./tests/venv/bin/avocado list --filter-by-tags-include-empty \
# ./pyvenv/bin/avocado list --filter-by-tags-include-empty \
# --filter-by-tags-include-empty-key -t accel:kvm,arch:x86_64 \
# tests/avocado/
#
Expand All @@ -22,7 +22,7 @@
# - tests/avocado/virtio_check_params.py:VirtioMaxSegSettingsCheck.test_machine_types
#
make get-vm-images
./tests/venv/bin/avocado run \
./pyvenv/bin/avocado run \
--job-results-dir=tests/results/ \
tests/avocado/boot_linux.py:BootLinuxX8664.test_pc_i440fx_kvm \
tests/avocado/boot_linux.py:BootLinuxX8664.test_pc_q35_kvm \
Expand Down
2 changes: 1 addition & 1 deletion scripts/device-crash-test
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ except ModuleNotFoundError as exc:
print(f"Module '{exc.name}' not found.")
print(" Try 'make check-venv' from your build directory,")
print(" and then one way to run this script is like so:")
print(f' > $builddir/tests/venv/bin/python3 "{path}"')
print(f' > $builddir/pyvenv/bin/python3 "{path}"')
sys.exit(1)

logger = logging.getLogger('device-crash-test')
Expand Down
19 changes: 8 additions & 11 deletions tests/Makefile.include
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,8 @@ distclean-tcg: $(DISTCLEAN_TCG_TARGET_RULES)
# Build up our target list from the filtered list of ninja targets
TARGETS=$(patsubst libqemu-%.fa, %, $(filter libqemu-%.fa, $(ninja-targets)))

TESTS_VENV_DIR=$(BUILD_DIR)/tests/venv
TESTS_VENV_REQ=$(SRC_PATH)/tests/requirements.txt
TESTS_VENV_TOKEN=$(BUILD_DIR)/pyvenv/tests.group
TESTS_RESULTS_DIR=$(BUILD_DIR)/tests/results
TESTS_PYTHON=$(TESTS_VENV_DIR)/bin/python3
ifndef AVOCADO_TESTS
AVOCADO_TESTS=tests/avocado
endif
Expand All @@ -108,20 +106,19 @@ else
endif

quiet-venv-pip = $(quiet-@)$(call quiet-command-run, \
$(TESTS_PYTHON) -m pip -q --disable-pip-version-check $1, \
$(PYTHON) -m pip -q --disable-pip-version-check $1, \
"VENVPIP","$1")

$(TESTS_VENV_DIR): $(TESTS_VENV_REQ)
$(call quiet-command, $(PYTHON) -m venv $@, VENV, $@)
$(TESTS_VENV_TOKEN): $(SRC_PATH)/pythondeps.toml
$(call quiet-venv-pip,install -e "$(SRC_PATH)/python/")
$(call quiet-venv-pip,install -r $(TESTS_VENV_REQ))
$(PYTHON) python/scripts/mkvenv.py ensuregroup --online $< avocado
$(call quiet-command, touch $@)

$(TESTS_RESULTS_DIR):
$(call quiet-command, mkdir -p $@, \
MKDIR, $@)

check-venv: $(TESTS_VENV_DIR)
check-venv: $(TESTS_VENV_TOKEN)

FEDORA_31_ARCHES_TARGETS=$(patsubst %-softmmu,%, $(filter %-softmmu,$(TARGETS)))
FEDORA_31_ARCHES_CANDIDATES=$(patsubst ppc64,ppc64le,$(FEDORA_31_ARCHES_TARGETS))
Expand All @@ -131,7 +128,7 @@ FEDORA_31_DOWNLOAD=$(filter $(FEDORA_31_ARCHES),$(FEDORA_31_ARCHES_CANDIDATES))
# download one specific Fedora 31 image
get-vm-image-fedora-31-%: check-venv
$(call quiet-command, \
$(TESTS_PYTHON) -m avocado vmimage get \
$(PYTHON) -m avocado vmimage get \
--distro=fedora --distro-version=31 --arch=$*, \
"AVOCADO", "Downloading avocado tests VM image for $*")

Expand All @@ -140,7 +137,7 @@ get-vm-images: check-venv $(patsubst %,get-vm-image-fedora-31-%, $(FEDORA_31_DOW

check-avocado: check-venv $(TESTS_RESULTS_DIR) get-vm-images
$(call quiet-command, \
$(TESTS_PYTHON) -m avocado \
$(PYTHON) -m avocado \
--show=$(AVOCADO_SHOW) run --job-results-dir=$(TESTS_RESULTS_DIR) \
$(if $(AVOCADO_TAGS),, --filter-by-tags-include-empty \
--filter-by-tags-include-empty-key) \
Expand All @@ -163,7 +160,7 @@ check:
check-build: run-ninja

check-clean:
rm -rf $(TESTS_VENV_DIR) $(TESTS_RESULTS_DIR)
rm -rf $(TESTS_RESULTS_DIR)

clean: check-clean clean-tcg
distclean: distclean-tcg
Expand Down
6 changes: 0 additions & 6 deletions tests/requirements.txt

This file was deleted.

2 changes: 1 addition & 1 deletion tests/vm/Makefile.include
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ ifeq ($(realpath $(SRC_PATH)),$(realpath .))
VM_PYTHON = PYTHONPATH=$(SRC_PATH)/python /usr/bin/env python3
VM_VENV =
else
VM_PYTHON = $(TESTS_PYTHON)
VM_PYTHON = $(PYTHON)
VM_VENV = check-venv
endif

Expand Down

0 comments on commit c03f57f

Please sign in to comment.