From 90066780c257685bd943780aa5e59f49b5fc2332 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Wed, 26 Dec 2012 00:15:05 +0100
Subject: [PATCH] Move python test files to test/py

This is the first step of the test files reorganisation: moving test/*
(except test/data) to new directory test/py/.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>
---
 Makefile.am                                   | 195 +++++++++---------
 autotools/gen-coverage                        |   4 +-
 doc/devnotes.rst                              |   2 +-
 test/{ => py}/bash_completion.bash            |   0
 test/{ => py}/cfgupgrade_unittest.py          |   0
 .../{ => py}/check-cert-expired_unittest.bash |   4 +-
 test/{ => py}/cli-test.bash                   |   2 +-
 test/{ => py}/daemon-util_unittest.bash       |   0
 test/{ => py}/docs_unittest.py                |   0
 test/{ => py}/ganeti-cleaner_unittest.bash    |   2 +-
 test/{ => py}/ganeti-cli.test                 |   0
 .../{ => py}/ganeti.asyncnotifier_unittest.py |   0
 .../ganeti.backend_unittest-runasroot.py      |   0
 test/{ => py}/ganeti.backend_unittest.py      |   0
 test/{ => py}/ganeti.bdev_unittest.py         |   0
 test/{ => py}/ganeti.cli_unittest.py          |   0
 .../ganeti.client.gnt_cluster_unittest.py     |   0
 .../ganeti.client.gnt_instance_unittest.py    |   0
 .../ganeti.client.gnt_job_unittest.py         |   0
 test/{ => py}/ganeti.cmdlib_unittest.py       |   0
 test/{ => py}/ganeti.compat_unittest.py       |   0
 test/{ => py}/ganeti.confd.client_unittest.py |   0
 test/{ => py}/ganeti.config_unittest.py       |   0
 test/{ => py}/ganeti.constants_unittest.py    |   0
 test/{ => py}/ganeti.daemon_unittest.py       |   0
 test/{ => py}/ganeti.errors_unittest.py       |   0
 test/{ => py}/ganeti.hooks_unittest.py        |   0
 test/{ => py}/ganeti.ht_unittest.py           |   0
 test/{ => py}/ganeti.http_unittest.py         |   0
 .../ganeti.hypervisor.hv_chroot_unittest.py   |   0
 .../ganeti.hypervisor.hv_fake_unittest.py     |   0
 .../ganeti.hypervisor.hv_kvm_unittest.py      |   0
 .../ganeti.hypervisor.hv_lxc_unittest.py      |   0
 .../ganeti.hypervisor.hv_xen_unittest.py      |   0
 test/{ => py}/ganeti.hypervisor_unittest.py   |   0
 test/{ => py}/ganeti.impexpd_unittest.py      |   0
 test/{ => py}/ganeti.jqueue_unittest.py       |   0
 test/{ => py}/ganeti.jstore_unittest.py       |   0
 test/{ => py}/ganeti.locking_unittest.py      |   0
 test/{ => py}/ganeti.luxi_unittest.py         |   0
 .../ganeti.masterd.iallocator_unittest.py     |   0
 .../ganeti.masterd.instance_unittest.py       |   0
 test/{ => py}/ganeti.mcpu_unittest.py         |   0
 test/{ => py}/ganeti.netutils_unittest.py     |   0
 test/{ => py}/ganeti.objects_unittest.py      |   0
 test/{ => py}/ganeti.objectutils_unittest.py  |   0
 test/{ => py}/ganeti.opcodes_unittest.py      |   0
 test/{ => py}/ganeti.ovf_unittest.py          |   0
 test/{ => py}/ganeti.qlang_unittest.py        |   0
 test/{ => py}/ganeti.query_unittest.py        |   0
 .../{ => py}/ganeti.rapi.baserlib_unittest.py |   0
 test/{ => py}/ganeti.rapi.client_unittest.py  |   0
 .../ganeti.rapi.resources_unittest.py         |   0
 test/{ => py}/ganeti.rapi.rlib2_unittest.py   |   0
 .../ganeti.rapi.testutils_unittest.py         |   0
 test/{ => py}/ganeti.rpc_unittest.py          |   0
 test/{ => py}/ganeti.runtime_unittest.py      |   0
 test/{ => py}/ganeti.serializer_unittest.py   |   0
 test/{ => py}/ganeti.server.rapi_unittest.py  |   0
 test/{ => py}/ganeti.ssconf_unittest.py       |   0
 test/{ => py}/ganeti.ssh_unittest.py          |   0
 test/{ => py}/ganeti.storage_unittest.py      |   0
 .../ganeti.tools.ensure_dirs_unittest.py      |   0
 ...ganeti.tools.node_daemon_setup_unittest.py |   0
 ...ganeti.tools.prepare_node_join_unittest.py |   0
 test/{ => py}/ganeti.uidpool_unittest.py      |   0
 test/{ => py}/ganeti.utils.algo_unittest.py   |   0
 .../ganeti.utils.filelock_unittest.py         |   0
 test/{ => py}/ganeti.utils.hash_unittest.py   |   0
 .../ganeti.utils.io_unittest-runasroot.py     |   0
 test/{ => py}/ganeti.utils.io_unittest.py     |   0
 test/{ => py}/ganeti.utils.log_unittest.py    |   0
 test/{ => py}/ganeti.utils.mlock_unittest.py  |   0
 .../ganeti.utils.nodesetup_unittest.py        |   0
 .../{ => py}/ganeti.utils.process_unittest.py |   0
 test/{ => py}/ganeti.utils.retry_unittest.py  |   0
 test/{ => py}/ganeti.utils.text_unittest.py   |   0
 .../{ => py}/ganeti.utils.wrapper_unittest.py |   0
 test/{ => py}/ganeti.utils.x509_unittest.py   |   0
 test/{ => py}/ganeti.utils_unittest.py        |   0
 test/{ => py}/ganeti.vcluster_unittest.py     |   0
 test/{ => py}/ganeti.workerpool_unittest.py   |   0
 test/{ => py}/gnt-cli.test                    |   0
 test/{ => py}/import-export_unittest-helper   |   0
 test/{ => py}/import-export_unittest.bash     |   4 +-
 test/{ => py}/lockperf.py                     |   0
 test/{ => py}/mocks.py                        |   0
 test/{ => py}/pycurl_reset_unittest.py        |   0
 test/{ => py}/qa.qa_config_unittest.py        |   0
 test/{ => py}/tempfile_fork_unittest.py       |   0
 test/{ => py}/testutils.py                    |   0
 91 files changed, 107 insertions(+), 106 deletions(-)
 rename test/{ => py}/bash_completion.bash (100%)
 rename test/{ => py}/cfgupgrade_unittest.py (100%)
 rename test/{ => py}/check-cert-expired_unittest.bash (94%)
 rename test/{ => py}/cli-test.bash (75%)
 rename test/{ => py}/daemon-util_unittest.bash (100%)
 rename test/{ => py}/docs_unittest.py (100%)
 rename test/{ => py}/ganeti-cleaner_unittest.bash (98%)
 rename test/{ => py}/ganeti-cli.test (100%)
 rename test/{ => py}/ganeti.asyncnotifier_unittest.py (100%)
 rename test/{ => py}/ganeti.backend_unittest-runasroot.py (100%)
 rename test/{ => py}/ganeti.backend_unittest.py (100%)
 rename test/{ => py}/ganeti.bdev_unittest.py (100%)
 rename test/{ => py}/ganeti.cli_unittest.py (100%)
 rename test/{ => py}/ganeti.client.gnt_cluster_unittest.py (100%)
 rename test/{ => py}/ganeti.client.gnt_instance_unittest.py (100%)
 rename test/{ => py}/ganeti.client.gnt_job_unittest.py (100%)
 rename test/{ => py}/ganeti.cmdlib_unittest.py (100%)
 rename test/{ => py}/ganeti.compat_unittest.py (100%)
 rename test/{ => py}/ganeti.confd.client_unittest.py (100%)
 rename test/{ => py}/ganeti.config_unittest.py (100%)
 rename test/{ => py}/ganeti.constants_unittest.py (100%)
 rename test/{ => py}/ganeti.daemon_unittest.py (100%)
 rename test/{ => py}/ganeti.errors_unittest.py (100%)
 rename test/{ => py}/ganeti.hooks_unittest.py (100%)
 rename test/{ => py}/ganeti.ht_unittest.py (100%)
 rename test/{ => py}/ganeti.http_unittest.py (100%)
 rename test/{ => py}/ganeti.hypervisor.hv_chroot_unittest.py (100%)
 rename test/{ => py}/ganeti.hypervisor.hv_fake_unittest.py (100%)
 rename test/{ => py}/ganeti.hypervisor.hv_kvm_unittest.py (100%)
 rename test/{ => py}/ganeti.hypervisor.hv_lxc_unittest.py (100%)
 rename test/{ => py}/ganeti.hypervisor.hv_xen_unittest.py (100%)
 rename test/{ => py}/ganeti.hypervisor_unittest.py (100%)
 rename test/{ => py}/ganeti.impexpd_unittest.py (100%)
 rename test/{ => py}/ganeti.jqueue_unittest.py (100%)
 rename test/{ => py}/ganeti.jstore_unittest.py (100%)
 rename test/{ => py}/ganeti.locking_unittest.py (100%)
 rename test/{ => py}/ganeti.luxi_unittest.py (100%)
 rename test/{ => py}/ganeti.masterd.iallocator_unittest.py (100%)
 rename test/{ => py}/ganeti.masterd.instance_unittest.py (100%)
 rename test/{ => py}/ganeti.mcpu_unittest.py (100%)
 rename test/{ => py}/ganeti.netutils_unittest.py (100%)
 rename test/{ => py}/ganeti.objects_unittest.py (100%)
 rename test/{ => py}/ganeti.objectutils_unittest.py (100%)
 rename test/{ => py}/ganeti.opcodes_unittest.py (100%)
 rename test/{ => py}/ganeti.ovf_unittest.py (100%)
 rename test/{ => py}/ganeti.qlang_unittest.py (100%)
 rename test/{ => py}/ganeti.query_unittest.py (100%)
 rename test/{ => py}/ganeti.rapi.baserlib_unittest.py (100%)
 rename test/{ => py}/ganeti.rapi.client_unittest.py (100%)
 rename test/{ => py}/ganeti.rapi.resources_unittest.py (100%)
 rename test/{ => py}/ganeti.rapi.rlib2_unittest.py (100%)
 rename test/{ => py}/ganeti.rapi.testutils_unittest.py (100%)
 rename test/{ => py}/ganeti.rpc_unittest.py (100%)
 rename test/{ => py}/ganeti.runtime_unittest.py (100%)
 rename test/{ => py}/ganeti.serializer_unittest.py (100%)
 rename test/{ => py}/ganeti.server.rapi_unittest.py (100%)
 rename test/{ => py}/ganeti.ssconf_unittest.py (100%)
 rename test/{ => py}/ganeti.ssh_unittest.py (100%)
 rename test/{ => py}/ganeti.storage_unittest.py (100%)
 rename test/{ => py}/ganeti.tools.ensure_dirs_unittest.py (100%)
 rename test/{ => py}/ganeti.tools.node_daemon_setup_unittest.py (100%)
 rename test/{ => py}/ganeti.tools.prepare_node_join_unittest.py (100%)
 rename test/{ => py}/ganeti.uidpool_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.algo_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.filelock_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.hash_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.io_unittest-runasroot.py (100%)
 rename test/{ => py}/ganeti.utils.io_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.log_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.mlock_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.nodesetup_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.process_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.retry_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.text_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.wrapper_unittest.py (100%)
 rename test/{ => py}/ganeti.utils.x509_unittest.py (100%)
 rename test/{ => py}/ganeti.utils_unittest.py (100%)
 rename test/{ => py}/ganeti.vcluster_unittest.py (100%)
 rename test/{ => py}/ganeti.workerpool_unittest.py (100%)
 rename test/{ => py}/gnt-cli.test (100%)
 rename test/{ => py}/import-export_unittest-helper (100%)
 rename test/{ => py}/import-export_unittest.bash (99%)
 rename test/{ => py}/lockperf.py (100%)
 rename test/{ => py}/mocks.py (100%)
 rename test/{ => py}/pycurl_reset_unittest.py (100%)
 rename test/{ => py}/qa.qa_config_unittest.py (100%)
 rename test/{ => py}/tempfile_fork_unittest.py (100%)
 rename test/{ => py}/testutils.py (100%)

diff --git a/Makefile.am b/Makefile.am
index d024e8a07..0b0bfe715 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -106,6 +106,7 @@ DIRS = \
 	test/data \
 	test/data/ovfdata \
 	test/data/ovfdata/other \
+	test/py \
 	tools
 
 ALL_APIDOC_HS_DIRS = \
@@ -814,9 +815,9 @@ EXTRA_DIST = \
 	doc/examples/gnt-debug/README \
 	doc/examples/gnt-debug/delay0.json \
 	doc/examples/gnt-debug/delay50.json \
-	test/lockperf.py \
-	test/testutils.py \
-	test/mocks.py \
+	test/py/lockperf.py \
+	test/py/testutils.py \
+	test/py/mocks.py \
 	$(dist_TESTS) \
 	$(TEST_FILES) \
 	man/footer.rst \
@@ -956,98 +957,98 @@ TEST_FILES = \
 	test/data/vgreduce-removemissing-2.02.66-ok.txt \
 	test/data/vgs-missing-pvs-2.02.02.txt \
 	test/data/vgs-missing-pvs-2.02.66.txt \
-	test/ganeti-cli.test \
-	test/gnt-cli.test \
-	test/import-export_unittest-helper
+	test/py/ganeti-cli.test \
+	test/py/gnt-cli.test \
+	test/py/import-export_unittest-helper
 
 python_tests = \
 	doc/examples/rapi_testutils.py \
-	test/cfgupgrade_unittest.py \
-	test/docs_unittest.py \
-	test/ganeti.asyncnotifier_unittest.py \
-	test/ganeti.backend_unittest-runasroot.py \
-	test/ganeti.backend_unittest.py \
-	test/ganeti.bdev_unittest.py \
-	test/ganeti.cli_unittest.py \
-	test/ganeti.client.gnt_cluster_unittest.py \
-	test/ganeti.client.gnt_instance_unittest.py \
-	test/ganeti.client.gnt_job_unittest.py \
-	test/ganeti.cmdlib_unittest.py \
-	test/ganeti.compat_unittest.py \
-	test/ganeti.confd.client_unittest.py \
-	test/ganeti.config_unittest.py \
-	test/ganeti.constants_unittest.py \
-	test/ganeti.daemon_unittest.py \
-	test/ganeti.errors_unittest.py \
-	test/ganeti.hooks_unittest.py \
-	test/ganeti.ht_unittest.py \
-	test/ganeti.http_unittest.py \
-	test/ganeti.hypervisor.hv_chroot_unittest.py \
-	test/ganeti.hypervisor.hv_fake_unittest.py \
-	test/ganeti.hypervisor.hv_kvm_unittest.py \
-	test/ganeti.hypervisor.hv_lxc_unittest.py \
-	test/ganeti.hypervisor.hv_xen_unittest.py \
-	test/ganeti.hypervisor_unittest.py \
-	test/ganeti.impexpd_unittest.py \
-	test/ganeti.jqueue_unittest.py \
-	test/ganeti.jstore_unittest.py \
-	test/ganeti.locking_unittest.py \
-	test/ganeti.luxi_unittest.py \
-	test/ganeti.masterd.iallocator_unittest.py \
-	test/ganeti.masterd.instance_unittest.py \
-	test/ganeti.mcpu_unittest.py \
-	test/ganeti.netutils_unittest.py \
-	test/ganeti.objects_unittest.py \
-	test/ganeti.objectutils_unittest.py \
-	test/ganeti.opcodes_unittest.py \
-	test/ganeti.ovf_unittest.py \
-	test/ganeti.qlang_unittest.py \
-	test/ganeti.query_unittest.py \
-	test/ganeti.rapi.baserlib_unittest.py \
-	test/ganeti.rapi.client_unittest.py \
-	test/ganeti.rapi.resources_unittest.py \
-	test/ganeti.rapi.rlib2_unittest.py \
-	test/ganeti.rapi.testutils_unittest.py \
-	test/ganeti.rpc_unittest.py \
-	test/ganeti.runtime_unittest.py \
-	test/ganeti.serializer_unittest.py \
-	test/ganeti.server.rapi_unittest.py \
-	test/ganeti.ssconf_unittest.py \
-	test/ganeti.ssh_unittest.py \
-	test/ganeti.storage_unittest.py \
-	test/ganeti.tools.ensure_dirs_unittest.py \
-	test/ganeti.tools.node_daemon_setup_unittest.py \
-	test/ganeti.tools.prepare_node_join_unittest.py \
-	test/ganeti.uidpool_unittest.py \
-	test/ganeti.utils.algo_unittest.py \
-	test/ganeti.utils.filelock_unittest.py \
-	test/ganeti.utils.hash_unittest.py \
-	test/ganeti.utils.io_unittest-runasroot.py \
-	test/ganeti.utils.io_unittest.py \
-	test/ganeti.utils.log_unittest.py \
-	test/ganeti.utils.mlock_unittest.py \
-	test/ganeti.utils.nodesetup_unittest.py \
-	test/ganeti.utils.process_unittest.py \
-	test/ganeti.utils.retry_unittest.py \
-	test/ganeti.utils.text_unittest.py \
-	test/ganeti.utils.wrapper_unittest.py \
-	test/ganeti.utils.x509_unittest.py \
-	test/ganeti.utils_unittest.py \
-	test/ganeti.vcluster_unittest.py \
-	test/ganeti.workerpool_unittest.py \
-	test/pycurl_reset_unittest.py \
-	test/qa.qa_config_unittest.py \
-	test/tempfile_fork_unittest.py
+	test/py/cfgupgrade_unittest.py \
+	test/py/docs_unittest.py \
+	test/py/ganeti.asyncnotifier_unittest.py \
+	test/py/ganeti.backend_unittest-runasroot.py \
+	test/py/ganeti.backend_unittest.py \
+	test/py/ganeti.bdev_unittest.py \
+	test/py/ganeti.cli_unittest.py \
+	test/py/ganeti.client.gnt_cluster_unittest.py \
+	test/py/ganeti.client.gnt_instance_unittest.py \
+	test/py/ganeti.client.gnt_job_unittest.py \
+	test/py/ganeti.cmdlib_unittest.py \
+	test/py/ganeti.compat_unittest.py \
+	test/py/ganeti.confd.client_unittest.py \
+	test/py/ganeti.config_unittest.py \
+	test/py/ganeti.constants_unittest.py \
+	test/py/ganeti.daemon_unittest.py \
+	test/py/ganeti.errors_unittest.py \
+	test/py/ganeti.hooks_unittest.py \
+	test/py/ganeti.ht_unittest.py \
+	test/py/ganeti.http_unittest.py \
+	test/py/ganeti.hypervisor.hv_chroot_unittest.py \
+	test/py/ganeti.hypervisor.hv_fake_unittest.py \
+	test/py/ganeti.hypervisor.hv_kvm_unittest.py \
+	test/py/ganeti.hypervisor.hv_lxc_unittest.py \
+	test/py/ganeti.hypervisor.hv_xen_unittest.py \
+	test/py/ganeti.hypervisor_unittest.py \
+	test/py/ganeti.impexpd_unittest.py \
+	test/py/ganeti.jqueue_unittest.py \
+	test/py/ganeti.jstore_unittest.py \
+	test/py/ganeti.locking_unittest.py \
+	test/py/ganeti.luxi_unittest.py \
+	test/py/ganeti.masterd.iallocator_unittest.py \
+	test/py/ganeti.masterd.instance_unittest.py \
+	test/py/ganeti.mcpu_unittest.py \
+	test/py/ganeti.netutils_unittest.py \
+	test/py/ganeti.objects_unittest.py \
+	test/py/ganeti.objectutils_unittest.py \
+	test/py/ganeti.opcodes_unittest.py \
+	test/py/ganeti.ovf_unittest.py \
+	test/py/ganeti.qlang_unittest.py \
+	test/py/ganeti.query_unittest.py \
+	test/py/ganeti.rapi.baserlib_unittest.py \
+	test/py/ganeti.rapi.client_unittest.py \
+	test/py/ganeti.rapi.resources_unittest.py \
+	test/py/ganeti.rapi.rlib2_unittest.py \
+	test/py/ganeti.rapi.testutils_unittest.py \
+	test/py/ganeti.rpc_unittest.py \
+	test/py/ganeti.runtime_unittest.py \
+	test/py/ganeti.serializer_unittest.py \
+	test/py/ganeti.server.rapi_unittest.py \
+	test/py/ganeti.ssconf_unittest.py \
+	test/py/ganeti.ssh_unittest.py \
+	test/py/ganeti.storage_unittest.py \
+	test/py/ganeti.tools.ensure_dirs_unittest.py \
+	test/py/ganeti.tools.node_daemon_setup_unittest.py \
+	test/py/ganeti.tools.prepare_node_join_unittest.py \
+	test/py/ganeti.uidpool_unittest.py \
+	test/py/ganeti.utils.algo_unittest.py \
+	test/py/ganeti.utils.filelock_unittest.py \
+	test/py/ganeti.utils.hash_unittest.py \
+	test/py/ganeti.utils.io_unittest-runasroot.py \
+	test/py/ganeti.utils.io_unittest.py \
+	test/py/ganeti.utils.log_unittest.py \
+	test/py/ganeti.utils.mlock_unittest.py \
+	test/py/ganeti.utils.nodesetup_unittest.py \
+	test/py/ganeti.utils.process_unittest.py \
+	test/py/ganeti.utils.retry_unittest.py \
+	test/py/ganeti.utils.text_unittest.py \
+	test/py/ganeti.utils.wrapper_unittest.py \
+	test/py/ganeti.utils.x509_unittest.py \
+	test/py/ganeti.utils_unittest.py \
+	test/py/ganeti.vcluster_unittest.py \
+	test/py/ganeti.workerpool_unittest.py \
+	test/py/pycurl_reset_unittest.py \
+	test/py/qa.qa_config_unittest.py \
+	test/py/tempfile_fork_unittest.py
 
 haskell_tests = htest/test
 
 dist_TESTS = \
-	test/check-cert-expired_unittest.bash \
-	test/daemon-util_unittest.bash \
-	test/ganeti-cleaner_unittest.bash \
-	test/import-export_unittest.bash \
-	test/cli-test.bash \
-	test/bash_completion.bash \
+	test/py/check-cert-expired_unittest.bash \
+	test/py/daemon-util_unittest.bash \
+	test/py/ganeti-cleaner_unittest.bash \
+	test/py/import-export_unittest.bash \
+	test/py/cli-test.bash \
+	test/py/bash_completion.bash \
 	$(python_tests)
 
 nodist_TESTS =
@@ -1099,12 +1100,12 @@ all_python_code = \
 
 srclink_files = \
 	man/footer.rst \
-	test/check-cert-expired_unittest.bash \
-	test/daemon-util_unittest.bash \
-	test/ganeti-cleaner_unittest.bash \
-	test/import-export_unittest.bash \
-	test/cli-test.bash \
-	test/bash_completion.bash \
+	test/py/check-cert-expired_unittest.bash \
+	test/py/daemon-util_unittest.bash \
+	test/py/ganeti-cleaner_unittest.bash \
+	test/py/import-export_unittest.bash \
+	test/py/cli-test.bash \
+	test/py/bash_completion.bash \
 	htest/offline-test.sh \
 	htest/cli-tests-defs.sh \
 	$(all_python_code) \
@@ -1145,11 +1146,11 @@ pep8_python_code = \
 	$(PYTHON_BOOTSTRAP) \
 	qa
 
-test/daemon-util_unittest.bash: daemons/daemon-util
+test/py/daemon-util_unittest.bash: daemons/daemon-util
 
-test/ganeti-cleaner_unittest.bash: daemons/ganeti-cleaner
+test/py/ganeti-cleaner_unittest.bash: daemons/ganeti-cleaner
 
-test/bash_completion.bash: doc/examples/bash_completion-debug
+test/py/bash_completion.bash: doc/examples/bash_completion-debug
 
 tools/kvm-ifup: tools/kvm-ifup.in $(REPLACE_VARS_SED)
 	sed -f $(REPLACE_VARS_SED) < $< > $@
diff --git a/autotools/gen-coverage b/autotools/gen-coverage
index 38bdd38b8..d16e66bb9 100755
--- a/autotools/gen-coverage
+++ b/autotools/gen-coverage
@@ -1,7 +1,7 @@
 #!/bin/bash
 #
 
-# Copyright (C) 2010, 2011 Google Inc.
+# Copyright (C) 2010, 2011, 2012 Google Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -30,7 +30,7 @@ set -u
 
 reportargs=(
   '--include=*'
-  '--omit=test/*'
+  '--omit=test/py/*'
   )
 
 $COVERAGE erase
diff --git a/doc/devnotes.rst b/doc/devnotes.rst
index 674442580..77112dd94 100644
--- a/doc/devnotes.rst
+++ b/doc/devnotes.rst
@@ -176,7 +176,7 @@ so for shell-tests (but these are faster, so it shouldn't be needed).
 For Python tests::
 
   $ export PYTHONPATH=$PWD
-  $ python ./test/ganeti.%mytest%
+  $ python ./test/py/ganeti.%mytest%
 
 For Haskell tests::
 
diff --git a/test/bash_completion.bash b/test/py/bash_completion.bash
similarity index 100%
rename from test/bash_completion.bash
rename to test/py/bash_completion.bash
diff --git a/test/cfgupgrade_unittest.py b/test/py/cfgupgrade_unittest.py
similarity index 100%
rename from test/cfgupgrade_unittest.py
rename to test/py/cfgupgrade_unittest.py
diff --git a/test/check-cert-expired_unittest.bash b/test/py/check-cert-expired_unittest.bash
similarity index 94%
rename from test/check-cert-expired_unittest.bash
rename to test/py/check-cert-expired_unittest.bash
index ab4f4536f..fbdba38c0 100755
--- a/test/check-cert-expired_unittest.bash
+++ b/test/py/check-cert-expired_unittest.bash
@@ -1,7 +1,7 @@
 #!/bin/bash
 #
 
-# Copyright (C) 2010 Google Inc.
+# Copyright (C) 2010, 2012 Google Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -32,7 +32,7 @@ err() {
 }
 
 impexpd_helper() {
-  $PYTHON "${TOP_SRCDIR:-.}/test/import-export_unittest-helper" "$@"
+  $PYTHON "${TOP_SRCDIR:-.}/test/py/import-export_unittest-helper" "$@"
 }
 
 $CCE 2>/dev/null && err 'Accepted empty argument list'
diff --git a/test/cli-test.bash b/test/py/cli-test.bash
similarity index 75%
rename from test/cli-test.bash
rename to test/py/cli-test.bash
index f768a5abd..aea5eddbd 100755
--- a/test/cli-test.bash
+++ b/test/py/cli-test.bash
@@ -4,5 +4,5 @@ export SCRIPTS=${TOP_BUILDDIR:-.}/scripts
 export DAEMONS=${TOP_BUILDDIR:-.}/daemons
 
 shelltest $SHELLTESTARGS \
-  ${TOP_SRCDIR:-.}/test/{gnt,ganeti}-*.test \
+  ${TOP_SRCDIR:-.}/test/py/{gnt,ganeti}-*.test \
   -- --hide-successes
diff --git a/test/daemon-util_unittest.bash b/test/py/daemon-util_unittest.bash
similarity index 100%
rename from test/daemon-util_unittest.bash
rename to test/py/daemon-util_unittest.bash
diff --git a/test/docs_unittest.py b/test/py/docs_unittest.py
similarity index 100%
rename from test/docs_unittest.py
rename to test/py/docs_unittest.py
diff --git a/test/ganeti-cleaner_unittest.bash b/test/py/ganeti-cleaner_unittest.bash
similarity index 98%
rename from test/ganeti-cleaner_unittest.bash
rename to test/py/ganeti-cleaner_unittest.bash
index 74eb9965b..bf57b762c 100755
--- a/test/ganeti-cleaner_unittest.bash
+++ b/test/py/ganeti-cleaner_unittest.bash
@@ -39,7 +39,7 @@ upto() {
 gencert() {
   local path=$1 validity=$2
   VALIDITY=$validity $PYTHON \
-    ${TOP_SRCDIR:-.}/test/import-export_unittest-helper \
+    ${TOP_SRCDIR:-.}/test/py/import-export_unittest-helper \
     $path gencert
 }
 
diff --git a/test/ganeti-cli.test b/test/py/ganeti-cli.test
similarity index 100%
rename from test/ganeti-cli.test
rename to test/py/ganeti-cli.test
diff --git a/test/ganeti.asyncnotifier_unittest.py b/test/py/ganeti.asyncnotifier_unittest.py
similarity index 100%
rename from test/ganeti.asyncnotifier_unittest.py
rename to test/py/ganeti.asyncnotifier_unittest.py
diff --git a/test/ganeti.backend_unittest-runasroot.py b/test/py/ganeti.backend_unittest-runasroot.py
similarity index 100%
rename from test/ganeti.backend_unittest-runasroot.py
rename to test/py/ganeti.backend_unittest-runasroot.py
diff --git a/test/ganeti.backend_unittest.py b/test/py/ganeti.backend_unittest.py
similarity index 100%
rename from test/ganeti.backend_unittest.py
rename to test/py/ganeti.backend_unittest.py
diff --git a/test/ganeti.bdev_unittest.py b/test/py/ganeti.bdev_unittest.py
similarity index 100%
rename from test/ganeti.bdev_unittest.py
rename to test/py/ganeti.bdev_unittest.py
diff --git a/test/ganeti.cli_unittest.py b/test/py/ganeti.cli_unittest.py
similarity index 100%
rename from test/ganeti.cli_unittest.py
rename to test/py/ganeti.cli_unittest.py
diff --git a/test/ganeti.client.gnt_cluster_unittest.py b/test/py/ganeti.client.gnt_cluster_unittest.py
similarity index 100%
rename from test/ganeti.client.gnt_cluster_unittest.py
rename to test/py/ganeti.client.gnt_cluster_unittest.py
diff --git a/test/ganeti.client.gnt_instance_unittest.py b/test/py/ganeti.client.gnt_instance_unittest.py
similarity index 100%
rename from test/ganeti.client.gnt_instance_unittest.py
rename to test/py/ganeti.client.gnt_instance_unittest.py
diff --git a/test/ganeti.client.gnt_job_unittest.py b/test/py/ganeti.client.gnt_job_unittest.py
similarity index 100%
rename from test/ganeti.client.gnt_job_unittest.py
rename to test/py/ganeti.client.gnt_job_unittest.py
diff --git a/test/ganeti.cmdlib_unittest.py b/test/py/ganeti.cmdlib_unittest.py
similarity index 100%
rename from test/ganeti.cmdlib_unittest.py
rename to test/py/ganeti.cmdlib_unittest.py
diff --git a/test/ganeti.compat_unittest.py b/test/py/ganeti.compat_unittest.py
similarity index 100%
rename from test/ganeti.compat_unittest.py
rename to test/py/ganeti.compat_unittest.py
diff --git a/test/ganeti.confd.client_unittest.py b/test/py/ganeti.confd.client_unittest.py
similarity index 100%
rename from test/ganeti.confd.client_unittest.py
rename to test/py/ganeti.confd.client_unittest.py
diff --git a/test/ganeti.config_unittest.py b/test/py/ganeti.config_unittest.py
similarity index 100%
rename from test/ganeti.config_unittest.py
rename to test/py/ganeti.config_unittest.py
diff --git a/test/ganeti.constants_unittest.py b/test/py/ganeti.constants_unittest.py
similarity index 100%
rename from test/ganeti.constants_unittest.py
rename to test/py/ganeti.constants_unittest.py
diff --git a/test/ganeti.daemon_unittest.py b/test/py/ganeti.daemon_unittest.py
similarity index 100%
rename from test/ganeti.daemon_unittest.py
rename to test/py/ganeti.daemon_unittest.py
diff --git a/test/ganeti.errors_unittest.py b/test/py/ganeti.errors_unittest.py
similarity index 100%
rename from test/ganeti.errors_unittest.py
rename to test/py/ganeti.errors_unittest.py
diff --git a/test/ganeti.hooks_unittest.py b/test/py/ganeti.hooks_unittest.py
similarity index 100%
rename from test/ganeti.hooks_unittest.py
rename to test/py/ganeti.hooks_unittest.py
diff --git a/test/ganeti.ht_unittest.py b/test/py/ganeti.ht_unittest.py
similarity index 100%
rename from test/ganeti.ht_unittest.py
rename to test/py/ganeti.ht_unittest.py
diff --git a/test/ganeti.http_unittest.py b/test/py/ganeti.http_unittest.py
similarity index 100%
rename from test/ganeti.http_unittest.py
rename to test/py/ganeti.http_unittest.py
diff --git a/test/ganeti.hypervisor.hv_chroot_unittest.py b/test/py/ganeti.hypervisor.hv_chroot_unittest.py
similarity index 100%
rename from test/ganeti.hypervisor.hv_chroot_unittest.py
rename to test/py/ganeti.hypervisor.hv_chroot_unittest.py
diff --git a/test/ganeti.hypervisor.hv_fake_unittest.py b/test/py/ganeti.hypervisor.hv_fake_unittest.py
similarity index 100%
rename from test/ganeti.hypervisor.hv_fake_unittest.py
rename to test/py/ganeti.hypervisor.hv_fake_unittest.py
diff --git a/test/ganeti.hypervisor.hv_kvm_unittest.py b/test/py/ganeti.hypervisor.hv_kvm_unittest.py
similarity index 100%
rename from test/ganeti.hypervisor.hv_kvm_unittest.py
rename to test/py/ganeti.hypervisor.hv_kvm_unittest.py
diff --git a/test/ganeti.hypervisor.hv_lxc_unittest.py b/test/py/ganeti.hypervisor.hv_lxc_unittest.py
similarity index 100%
rename from test/ganeti.hypervisor.hv_lxc_unittest.py
rename to test/py/ganeti.hypervisor.hv_lxc_unittest.py
diff --git a/test/ganeti.hypervisor.hv_xen_unittest.py b/test/py/ganeti.hypervisor.hv_xen_unittest.py
similarity index 100%
rename from test/ganeti.hypervisor.hv_xen_unittest.py
rename to test/py/ganeti.hypervisor.hv_xen_unittest.py
diff --git a/test/ganeti.hypervisor_unittest.py b/test/py/ganeti.hypervisor_unittest.py
similarity index 100%
rename from test/ganeti.hypervisor_unittest.py
rename to test/py/ganeti.hypervisor_unittest.py
diff --git a/test/ganeti.impexpd_unittest.py b/test/py/ganeti.impexpd_unittest.py
similarity index 100%
rename from test/ganeti.impexpd_unittest.py
rename to test/py/ganeti.impexpd_unittest.py
diff --git a/test/ganeti.jqueue_unittest.py b/test/py/ganeti.jqueue_unittest.py
similarity index 100%
rename from test/ganeti.jqueue_unittest.py
rename to test/py/ganeti.jqueue_unittest.py
diff --git a/test/ganeti.jstore_unittest.py b/test/py/ganeti.jstore_unittest.py
similarity index 100%
rename from test/ganeti.jstore_unittest.py
rename to test/py/ganeti.jstore_unittest.py
diff --git a/test/ganeti.locking_unittest.py b/test/py/ganeti.locking_unittest.py
similarity index 100%
rename from test/ganeti.locking_unittest.py
rename to test/py/ganeti.locking_unittest.py
diff --git a/test/ganeti.luxi_unittest.py b/test/py/ganeti.luxi_unittest.py
similarity index 100%
rename from test/ganeti.luxi_unittest.py
rename to test/py/ganeti.luxi_unittest.py
diff --git a/test/ganeti.masterd.iallocator_unittest.py b/test/py/ganeti.masterd.iallocator_unittest.py
similarity index 100%
rename from test/ganeti.masterd.iallocator_unittest.py
rename to test/py/ganeti.masterd.iallocator_unittest.py
diff --git a/test/ganeti.masterd.instance_unittest.py b/test/py/ganeti.masterd.instance_unittest.py
similarity index 100%
rename from test/ganeti.masterd.instance_unittest.py
rename to test/py/ganeti.masterd.instance_unittest.py
diff --git a/test/ganeti.mcpu_unittest.py b/test/py/ganeti.mcpu_unittest.py
similarity index 100%
rename from test/ganeti.mcpu_unittest.py
rename to test/py/ganeti.mcpu_unittest.py
diff --git a/test/ganeti.netutils_unittest.py b/test/py/ganeti.netutils_unittest.py
similarity index 100%
rename from test/ganeti.netutils_unittest.py
rename to test/py/ganeti.netutils_unittest.py
diff --git a/test/ganeti.objects_unittest.py b/test/py/ganeti.objects_unittest.py
similarity index 100%
rename from test/ganeti.objects_unittest.py
rename to test/py/ganeti.objects_unittest.py
diff --git a/test/ganeti.objectutils_unittest.py b/test/py/ganeti.objectutils_unittest.py
similarity index 100%
rename from test/ganeti.objectutils_unittest.py
rename to test/py/ganeti.objectutils_unittest.py
diff --git a/test/ganeti.opcodes_unittest.py b/test/py/ganeti.opcodes_unittest.py
similarity index 100%
rename from test/ganeti.opcodes_unittest.py
rename to test/py/ganeti.opcodes_unittest.py
diff --git a/test/ganeti.ovf_unittest.py b/test/py/ganeti.ovf_unittest.py
similarity index 100%
rename from test/ganeti.ovf_unittest.py
rename to test/py/ganeti.ovf_unittest.py
diff --git a/test/ganeti.qlang_unittest.py b/test/py/ganeti.qlang_unittest.py
similarity index 100%
rename from test/ganeti.qlang_unittest.py
rename to test/py/ganeti.qlang_unittest.py
diff --git a/test/ganeti.query_unittest.py b/test/py/ganeti.query_unittest.py
similarity index 100%
rename from test/ganeti.query_unittest.py
rename to test/py/ganeti.query_unittest.py
diff --git a/test/ganeti.rapi.baserlib_unittest.py b/test/py/ganeti.rapi.baserlib_unittest.py
similarity index 100%
rename from test/ganeti.rapi.baserlib_unittest.py
rename to test/py/ganeti.rapi.baserlib_unittest.py
diff --git a/test/ganeti.rapi.client_unittest.py b/test/py/ganeti.rapi.client_unittest.py
similarity index 100%
rename from test/ganeti.rapi.client_unittest.py
rename to test/py/ganeti.rapi.client_unittest.py
diff --git a/test/ganeti.rapi.resources_unittest.py b/test/py/ganeti.rapi.resources_unittest.py
similarity index 100%
rename from test/ganeti.rapi.resources_unittest.py
rename to test/py/ganeti.rapi.resources_unittest.py
diff --git a/test/ganeti.rapi.rlib2_unittest.py b/test/py/ganeti.rapi.rlib2_unittest.py
similarity index 100%
rename from test/ganeti.rapi.rlib2_unittest.py
rename to test/py/ganeti.rapi.rlib2_unittest.py
diff --git a/test/ganeti.rapi.testutils_unittest.py b/test/py/ganeti.rapi.testutils_unittest.py
similarity index 100%
rename from test/ganeti.rapi.testutils_unittest.py
rename to test/py/ganeti.rapi.testutils_unittest.py
diff --git a/test/ganeti.rpc_unittest.py b/test/py/ganeti.rpc_unittest.py
similarity index 100%
rename from test/ganeti.rpc_unittest.py
rename to test/py/ganeti.rpc_unittest.py
diff --git a/test/ganeti.runtime_unittest.py b/test/py/ganeti.runtime_unittest.py
similarity index 100%
rename from test/ganeti.runtime_unittest.py
rename to test/py/ganeti.runtime_unittest.py
diff --git a/test/ganeti.serializer_unittest.py b/test/py/ganeti.serializer_unittest.py
similarity index 100%
rename from test/ganeti.serializer_unittest.py
rename to test/py/ganeti.serializer_unittest.py
diff --git a/test/ganeti.server.rapi_unittest.py b/test/py/ganeti.server.rapi_unittest.py
similarity index 100%
rename from test/ganeti.server.rapi_unittest.py
rename to test/py/ganeti.server.rapi_unittest.py
diff --git a/test/ganeti.ssconf_unittest.py b/test/py/ganeti.ssconf_unittest.py
similarity index 100%
rename from test/ganeti.ssconf_unittest.py
rename to test/py/ganeti.ssconf_unittest.py
diff --git a/test/ganeti.ssh_unittest.py b/test/py/ganeti.ssh_unittest.py
similarity index 100%
rename from test/ganeti.ssh_unittest.py
rename to test/py/ganeti.ssh_unittest.py
diff --git a/test/ganeti.storage_unittest.py b/test/py/ganeti.storage_unittest.py
similarity index 100%
rename from test/ganeti.storage_unittest.py
rename to test/py/ganeti.storage_unittest.py
diff --git a/test/ganeti.tools.ensure_dirs_unittest.py b/test/py/ganeti.tools.ensure_dirs_unittest.py
similarity index 100%
rename from test/ganeti.tools.ensure_dirs_unittest.py
rename to test/py/ganeti.tools.ensure_dirs_unittest.py
diff --git a/test/ganeti.tools.node_daemon_setup_unittest.py b/test/py/ganeti.tools.node_daemon_setup_unittest.py
similarity index 100%
rename from test/ganeti.tools.node_daemon_setup_unittest.py
rename to test/py/ganeti.tools.node_daemon_setup_unittest.py
diff --git a/test/ganeti.tools.prepare_node_join_unittest.py b/test/py/ganeti.tools.prepare_node_join_unittest.py
similarity index 100%
rename from test/ganeti.tools.prepare_node_join_unittest.py
rename to test/py/ganeti.tools.prepare_node_join_unittest.py
diff --git a/test/ganeti.uidpool_unittest.py b/test/py/ganeti.uidpool_unittest.py
similarity index 100%
rename from test/ganeti.uidpool_unittest.py
rename to test/py/ganeti.uidpool_unittest.py
diff --git a/test/ganeti.utils.algo_unittest.py b/test/py/ganeti.utils.algo_unittest.py
similarity index 100%
rename from test/ganeti.utils.algo_unittest.py
rename to test/py/ganeti.utils.algo_unittest.py
diff --git a/test/ganeti.utils.filelock_unittest.py b/test/py/ganeti.utils.filelock_unittest.py
similarity index 100%
rename from test/ganeti.utils.filelock_unittest.py
rename to test/py/ganeti.utils.filelock_unittest.py
diff --git a/test/ganeti.utils.hash_unittest.py b/test/py/ganeti.utils.hash_unittest.py
similarity index 100%
rename from test/ganeti.utils.hash_unittest.py
rename to test/py/ganeti.utils.hash_unittest.py
diff --git a/test/ganeti.utils.io_unittest-runasroot.py b/test/py/ganeti.utils.io_unittest-runasroot.py
similarity index 100%
rename from test/ganeti.utils.io_unittest-runasroot.py
rename to test/py/ganeti.utils.io_unittest-runasroot.py
diff --git a/test/ganeti.utils.io_unittest.py b/test/py/ganeti.utils.io_unittest.py
similarity index 100%
rename from test/ganeti.utils.io_unittest.py
rename to test/py/ganeti.utils.io_unittest.py
diff --git a/test/ganeti.utils.log_unittest.py b/test/py/ganeti.utils.log_unittest.py
similarity index 100%
rename from test/ganeti.utils.log_unittest.py
rename to test/py/ganeti.utils.log_unittest.py
diff --git a/test/ganeti.utils.mlock_unittest.py b/test/py/ganeti.utils.mlock_unittest.py
similarity index 100%
rename from test/ganeti.utils.mlock_unittest.py
rename to test/py/ganeti.utils.mlock_unittest.py
diff --git a/test/ganeti.utils.nodesetup_unittest.py b/test/py/ganeti.utils.nodesetup_unittest.py
similarity index 100%
rename from test/ganeti.utils.nodesetup_unittest.py
rename to test/py/ganeti.utils.nodesetup_unittest.py
diff --git a/test/ganeti.utils.process_unittest.py b/test/py/ganeti.utils.process_unittest.py
similarity index 100%
rename from test/ganeti.utils.process_unittest.py
rename to test/py/ganeti.utils.process_unittest.py
diff --git a/test/ganeti.utils.retry_unittest.py b/test/py/ganeti.utils.retry_unittest.py
similarity index 100%
rename from test/ganeti.utils.retry_unittest.py
rename to test/py/ganeti.utils.retry_unittest.py
diff --git a/test/ganeti.utils.text_unittest.py b/test/py/ganeti.utils.text_unittest.py
similarity index 100%
rename from test/ganeti.utils.text_unittest.py
rename to test/py/ganeti.utils.text_unittest.py
diff --git a/test/ganeti.utils.wrapper_unittest.py b/test/py/ganeti.utils.wrapper_unittest.py
similarity index 100%
rename from test/ganeti.utils.wrapper_unittest.py
rename to test/py/ganeti.utils.wrapper_unittest.py
diff --git a/test/ganeti.utils.x509_unittest.py b/test/py/ganeti.utils.x509_unittest.py
similarity index 100%
rename from test/ganeti.utils.x509_unittest.py
rename to test/py/ganeti.utils.x509_unittest.py
diff --git a/test/ganeti.utils_unittest.py b/test/py/ganeti.utils_unittest.py
similarity index 100%
rename from test/ganeti.utils_unittest.py
rename to test/py/ganeti.utils_unittest.py
diff --git a/test/ganeti.vcluster_unittest.py b/test/py/ganeti.vcluster_unittest.py
similarity index 100%
rename from test/ganeti.vcluster_unittest.py
rename to test/py/ganeti.vcluster_unittest.py
diff --git a/test/ganeti.workerpool_unittest.py b/test/py/ganeti.workerpool_unittest.py
similarity index 100%
rename from test/ganeti.workerpool_unittest.py
rename to test/py/ganeti.workerpool_unittest.py
diff --git a/test/gnt-cli.test b/test/py/gnt-cli.test
similarity index 100%
rename from test/gnt-cli.test
rename to test/py/gnt-cli.test
diff --git a/test/import-export_unittest-helper b/test/py/import-export_unittest-helper
similarity index 100%
rename from test/import-export_unittest-helper
rename to test/py/import-export_unittest-helper
diff --git a/test/import-export_unittest.bash b/test/py/import-export_unittest.bash
similarity index 99%
rename from test/import-export_unittest.bash
rename to test/py/import-export_unittest.bash
index 318ce5c22..b1672b403 100755
--- a/test/import-export_unittest.bash
+++ b/test/py/import-export_unittest.bash
@@ -1,7 +1,7 @@
 #!/bin/bash
 #
 
-# Copyright (C) 2010 Google Inc.
+# Copyright (C) 2010, 2012 Google Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -144,7 +144,7 @@ cat $(get_testfile proc_drbd8.txt) $(get_testfile cert1.pem) > $testdata
 } > $largetestdata
 
 impexpd_helper() {
-  $PYTHON $(get_testpath)/import-export_unittest-helper "$@"
+  $PYTHON $(get_testpath)/py/import-export_unittest-helper "$@"
 }
 
 start_test() {
diff --git a/test/lockperf.py b/test/py/lockperf.py
similarity index 100%
rename from test/lockperf.py
rename to test/py/lockperf.py
diff --git a/test/mocks.py b/test/py/mocks.py
similarity index 100%
rename from test/mocks.py
rename to test/py/mocks.py
diff --git a/test/pycurl_reset_unittest.py b/test/py/pycurl_reset_unittest.py
similarity index 100%
rename from test/pycurl_reset_unittest.py
rename to test/py/pycurl_reset_unittest.py
diff --git a/test/qa.qa_config_unittest.py b/test/py/qa.qa_config_unittest.py
similarity index 100%
rename from test/qa.qa_config_unittest.py
rename to test/py/qa.qa_config_unittest.py
diff --git a/test/tempfile_fork_unittest.py b/test/py/tempfile_fork_unittest.py
similarity index 100%
rename from test/tempfile_fork_unittest.py
rename to test/py/tempfile_fork_unittest.py
diff --git a/test/testutils.py b/test/py/testutils.py
similarity index 100%
rename from test/testutils.py
rename to test/py/testutils.py
-- 
GitLab