Revert "tests: Use separate virtual environment for avocado"
This reverts commit e8e4298feadae7924cf7600bb3bcc5b0a8d7cbe9. 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>
This commit is contained in:
		
							parent
							
								
									c853c4d087
								
							
						
					
					
						commit
						c03f57fd5b
					
				@ -103,7 +103,7 @@ crash-test-debian:
 | 
				
			|||||||
  script:
 | 
					  script:
 | 
				
			||||||
    - cd build
 | 
					    - cd build
 | 
				
			||||||
    - make NINJA=":" check-venv
 | 
					    - 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:
 | 
					build-system-fedora:
 | 
				
			||||||
  extends:
 | 
					  extends:
 | 
				
			||||||
@ -146,8 +146,8 @@ crash-test-fedora:
 | 
				
			|||||||
  script:
 | 
					  script:
 | 
				
			||||||
    - cd build
 | 
					    - cd build
 | 
				
			||||||
    - make NINJA=":" check-venv
 | 
					    - make NINJA=":" check-venv
 | 
				
			||||||
    - tests/venv/bin/python3 scripts/device-crash-test -q ./qemu-system-ppc
 | 
					    - pyvenv/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-riscv32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
build-system-centos:
 | 
					build-system-centos:
 | 
				
			||||||
  extends:
 | 
					  extends:
 | 
				
			||||||
 | 
				
			|||||||
@ -61,19 +61,19 @@ Under ``tests/avocado/`` as the root we have:
 | 
				
			|||||||
   ::
 | 
					   ::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     $ make check-venv (needed only the first time to create the venv)
 | 
					     $ 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.
 | 
					   The above will run all acpi avocado tests including this one.
 | 
				
			||||||
   In order to run the individual tests, perform the following:
 | 
					   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
 | 
					   The above will produce output in tap format. You can omit "--tap -" in the
 | 
				
			||||||
   end and it will produce output like the following:
 | 
					   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
 | 
					      Fetching asset from tests/avocado/acpi-bits.py:AcpiBitsTest.test_acpi_smbios_bits
 | 
				
			||||||
      JOB ID     : eab225724da7b64c012c65705dc2fa14ab1defef
 | 
					      JOB ID     : eab225724da7b64c012c65705dc2fa14ab1defef
 | 
				
			||||||
      JOB LOG    : /home/anisinha/avocado/job-results/job-2022-10-10T17.58-eab2257/job.log
 | 
					      JOB LOG    : /home/anisinha/avocado/job-results/job-2022-10-10T17.58-eab2257/job.log
 | 
				
			||||||
 | 
				
			|||||||
@ -894,9 +894,9 @@ You can run the avocado tests simply by executing:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  make check-avocado
 | 
					  make check-avocado
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This involves the automatic creation of Python virtual environment
 | 
					This involves the automatic installation, from PyPI, of all the
 | 
				
			||||||
within the build tree (at ``tests/venv``) which will have all the
 | 
					necessary avocado-framework dependencies into the QEMU venv within the
 | 
				
			||||||
right dependencies, and will save tests results also within the
 | 
					build tree (at ``./pyvenv``). Test results are also saved within the
 | 
				
			||||||
build tree (at ``tests/results``).
 | 
					build tree (at ``tests/results``).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Note: the build environment must be using a Python 3 stack, and have
 | 
					Note: the build environment must be using a Python 3 stack, and have
 | 
				
			||||||
@ -953,7 +953,7 @@ may be invoked by running:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 .. code::
 | 
					 .. 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
 | 
					Note that if ``make check-avocado`` was not executed before, it is
 | 
				
			||||||
possible to create the Python virtual environment with the dependencies
 | 
					possible to create the Python virtual environment with the dependencies
 | 
				
			||||||
@ -968,20 +968,20 @@ a test file. To run tests from a single file within the build tree, use:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 .. code::
 | 
					 .. 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:
 | 
					To run a single test within a test file, use:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 .. code::
 | 
					 .. 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
 | 
					Valid test names are visible in the output from any previous execution
 | 
				
			||||||
of Avocado or ``make check-avocado``, and can also be queried using:
 | 
					of Avocado or ``make check-avocado``, and can also be queried using:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 .. code::
 | 
					 .. code::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tests/venv/bin/avocado list tests/avocado
 | 
					  pyvenv/bin/avocado list tests/avocado
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Manual Installation
 | 
					Manual Installation
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
				
			|||||||
@ -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!?"
 | 
					            "Python >=3.11 does not have tomllib... what have you done!?"
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    # Use loads() to support both tomli v1.2.x (Ubuntu 22.04,
 | 
				
			||||||
        # Use loads() to support both tomli v1.2.x (Ubuntu 22.04,
 | 
					    # Debian bullseye-backports) and v2.0.x
 | 
				
			||||||
        # Debian bullseye-backports) and v2.0.x
 | 
					    with open(file, "r", encoding="ascii") as depfile:
 | 
				
			||||||
        with open(file, "r", encoding="ascii") as depfile:
 | 
					        contents = depfile.read()
 | 
				
			||||||
            contents = depfile.read()
 | 
					        return tomllib.loads(contents)  # type: ignore
 | 
				
			||||||
            return tomllib.loads(contents)  # type: ignore
 | 
					 | 
				
			||||||
    except tomllib.TOMLDecodeError as exc:
 | 
					 | 
				
			||||||
        raise Ouch(f"parsing {file} failed: {exc}") from exc
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def ensure_group(
 | 
					def ensure_group(
 | 
				
			||||||
 | 
				
			|||||||
@ -23,3 +23,10 @@ meson = { accepted = ">=0.63.0", installed = "0.63.3", canary = "meson" }
 | 
				
			|||||||
[docs]
 | 
					[docs]
 | 
				
			||||||
sphinx = { accepted = ">=1.6", installed = "5.3.0", canary = "sphinx-build" }
 | 
					sphinx = { accepted = ">=1.6", installed = "5.3.0", canary = "sphinx-build" }
 | 
				
			||||||
sphinx_rtd_theme = { accepted = ">=0.5", installed = "1.1.1" }
 | 
					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,7 +4,7 @@
 | 
				
			|||||||
# KVM and x86_64, or tests that are generic enough to be valid for all
 | 
					# KVM and x86_64, or tests that are generic enough to be valid for all
 | 
				
			||||||
# targets. Such a test list can be generated with:
 | 
					# 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 \
 | 
					#   --filter-by-tags-include-empty-key -t accel:kvm,arch:x86_64 \
 | 
				
			||||||
#   tests/avocado/
 | 
					#   tests/avocado/
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
@ -22,7 +22,7 @@
 | 
				
			|||||||
#   - tests/avocado/virtio_check_params.py:VirtioMaxSegSettingsCheck.test_machine_types
 | 
					#   - tests/avocado/virtio_check_params.py:VirtioMaxSegSettingsCheck.test_machine_types
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
make get-vm-images
 | 
					make get-vm-images
 | 
				
			||||||
./tests/venv/bin/avocado run \
 | 
					./pyvenv/bin/avocado run \
 | 
				
			||||||
    --job-results-dir=tests/results/ \
 | 
					    --job-results-dir=tests/results/ \
 | 
				
			||||||
    tests/avocado/boot_linux.py:BootLinuxX8664.test_pc_i440fx_kvm \
 | 
					    tests/avocado/boot_linux.py:BootLinuxX8664.test_pc_i440fx_kvm \
 | 
				
			||||||
    tests/avocado/boot_linux.py:BootLinuxX8664.test_pc_q35_kvm \
 | 
					    tests/avocado/boot_linux.py:BootLinuxX8664.test_pc_q35_kvm \
 | 
				
			||||||
 | 
				
			|||||||
@ -43,7 +43,7 @@ except ModuleNotFoundError as exc:
 | 
				
			|||||||
    print(f"Module '{exc.name}' not found.")
 | 
					    print(f"Module '{exc.name}' not found.")
 | 
				
			||||||
    print("  Try 'make check-venv' from your build directory,")
 | 
					    print("  Try 'make check-venv' from your build directory,")
 | 
				
			||||||
    print("  and then one way to run this script is like so:")
 | 
					    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)
 | 
					    sys.exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
logger = logging.getLogger('device-crash-test')
 | 
					logger = logging.getLogger('device-crash-test')
 | 
				
			||||||
 | 
				
			|||||||
@ -89,10 +89,8 @@ distclean-tcg: $(DISTCLEAN_TCG_TARGET_RULES)
 | 
				
			|||||||
# Build up our target list from the filtered list of ninja targets
 | 
					# Build up our target list from the filtered list of ninja targets
 | 
				
			||||||
TARGETS=$(patsubst libqemu-%.fa, %, $(filter libqemu-%.fa, $(ninja-targets)))
 | 
					TARGETS=$(patsubst libqemu-%.fa, %, $(filter libqemu-%.fa, $(ninja-targets)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TESTS_VENV_DIR=$(BUILD_DIR)/tests/venv
 | 
					TESTS_VENV_TOKEN=$(BUILD_DIR)/pyvenv/tests.group
 | 
				
			||||||
TESTS_VENV_REQ=$(SRC_PATH)/tests/requirements.txt
 | 
					 | 
				
			||||||
TESTS_RESULTS_DIR=$(BUILD_DIR)/tests/results
 | 
					TESTS_RESULTS_DIR=$(BUILD_DIR)/tests/results
 | 
				
			||||||
TESTS_PYTHON=$(TESTS_VENV_DIR)/bin/python3
 | 
					 | 
				
			||||||
ifndef AVOCADO_TESTS
 | 
					ifndef AVOCADO_TESTS
 | 
				
			||||||
	AVOCADO_TESTS=tests/avocado
 | 
						AVOCADO_TESTS=tests/avocado
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
@ -108,20 +106,19 @@ else
 | 
				
			|||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
quiet-venv-pip = $(quiet-@)$(call quiet-command-run, \
 | 
					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")
 | 
					    "VENVPIP","$1")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(TESTS_VENV_DIR): $(TESTS_VENV_REQ)
 | 
					$(TESTS_VENV_TOKEN): $(SRC_PATH)/pythondeps.toml
 | 
				
			||||||
	$(call quiet-command, $(PYTHON) -m venv $@, VENV, $@)
 | 
					 | 
				
			||||||
	$(call quiet-venv-pip,install -e "$(SRC_PATH)/python/")
 | 
						$(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 $@)
 | 
						$(call quiet-command, touch $@)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(TESTS_RESULTS_DIR):
 | 
					$(TESTS_RESULTS_DIR):
 | 
				
			||||||
	$(call quiet-command, mkdir -p $@, \
 | 
						$(call quiet-command, mkdir -p $@, \
 | 
				
			||||||
            MKDIR, $@)
 | 
					            MKDIR, $@)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
check-venv: $(TESTS_VENV_DIR)
 | 
					check-venv: $(TESTS_VENV_TOKEN)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FEDORA_31_ARCHES_TARGETS=$(patsubst %-softmmu,%, $(filter %-softmmu,$(TARGETS)))
 | 
					FEDORA_31_ARCHES_TARGETS=$(patsubst %-softmmu,%, $(filter %-softmmu,$(TARGETS)))
 | 
				
			||||||
FEDORA_31_ARCHES_CANDIDATES=$(patsubst ppc64,ppc64le,$(FEDORA_31_ARCHES_TARGETS))
 | 
					FEDORA_31_ARCHES_CANDIDATES=$(patsubst ppc64,ppc64le,$(FEDORA_31_ARCHES_TARGETS))
 | 
				
			||||||
@ -131,7 +128,7 @@ FEDORA_31_DOWNLOAD=$(filter $(FEDORA_31_ARCHES),$(FEDORA_31_ARCHES_CANDIDATES))
 | 
				
			|||||||
# download one specific Fedora 31 image
 | 
					# download one specific Fedora 31 image
 | 
				
			||||||
get-vm-image-fedora-31-%: check-venv
 | 
					get-vm-image-fedora-31-%: check-venv
 | 
				
			||||||
	$(call quiet-command, \
 | 
						$(call quiet-command, \
 | 
				
			||||||
             $(TESTS_PYTHON) -m avocado vmimage get \
 | 
					             $(PYTHON) -m avocado vmimage get \
 | 
				
			||||||
             --distro=fedora --distro-version=31 --arch=$*, \
 | 
					             --distro=fedora --distro-version=31 --arch=$*, \
 | 
				
			||||||
	"AVOCADO", "Downloading avocado tests VM image for $*")
 | 
						"AVOCADO", "Downloading avocado tests VM image for $*")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -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
 | 
					check-avocado: check-venv $(TESTS_RESULTS_DIR) get-vm-images
 | 
				
			||||||
	$(call quiet-command, \
 | 
						$(call quiet-command, \
 | 
				
			||||||
            $(TESTS_PYTHON) -m avocado \
 | 
					            $(PYTHON) -m avocado \
 | 
				
			||||||
            --show=$(AVOCADO_SHOW) run --job-results-dir=$(TESTS_RESULTS_DIR) \
 | 
					            --show=$(AVOCADO_SHOW) run --job-results-dir=$(TESTS_RESULTS_DIR) \
 | 
				
			||||||
            $(if $(AVOCADO_TAGS),, --filter-by-tags-include-empty \
 | 
					            $(if $(AVOCADO_TAGS),, --filter-by-tags-include-empty \
 | 
				
			||||||
			--filter-by-tags-include-empty-key) \
 | 
								--filter-by-tags-include-empty-key) \
 | 
				
			||||||
@ -163,7 +160,7 @@ check:
 | 
				
			|||||||
check-build: run-ninja
 | 
					check-build: run-ninja
 | 
				
			||||||
 | 
					
 | 
				
			||||||
check-clean:
 | 
					check-clean:
 | 
				
			||||||
	rm -rf $(TESTS_VENV_DIR) $(TESTS_RESULTS_DIR)
 | 
						rm -rf $(TESTS_RESULTS_DIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean: check-clean clean-tcg
 | 
					clean: check-clean clean-tcg
 | 
				
			||||||
distclean: distclean-tcg
 | 
					distclean: distclean-tcg
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +0,0 @@
 | 
				
			|||||||
# Add Python module requirements, one per line, to be installed
 | 
					 | 
				
			||||||
# in the tests/venv Python virtual environment. For more info,
 | 
					 | 
				
			||||||
# refer to: https://pip.pypa.io/en/stable/user_guide/#id1
 | 
					 | 
				
			||||||
# Note that qemu.git/python/ is always implicitly installed.
 | 
					 | 
				
			||||||
avocado-framework==88.1
 | 
					 | 
				
			||||||
pycdlib==1.11.0
 | 
					 | 
				
			||||||
@ -5,7 +5,7 @@ ifeq ($(realpath $(SRC_PATH)),$(realpath .))
 | 
				
			|||||||
VM_PYTHON = PYTHONPATH=$(SRC_PATH)/python /usr/bin/env python3
 | 
					VM_PYTHON = PYTHONPATH=$(SRC_PATH)/python /usr/bin/env python3
 | 
				
			||||||
VM_VENV =
 | 
					VM_VENV =
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
VM_PYTHON = $(TESTS_PYTHON)
 | 
					VM_PYTHON = $(PYTHON)
 | 
				
			||||||
VM_VENV = check-venv
 | 
					VM_VENV = check-venv
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user