From 9a0d49a71869e5c3b1680b3d2e528658347609c8 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Sun, 2 Feb 2020 18:16:48 -0500 Subject: [PATCH] virtinst: uri: Rework MagicURI to work with passed in fakeuri Rather than individual options for each possible hypervisor, and annotations like 'remote' or 'session', just have it take a fake URI to mock Signed-off-by: Cole Robinson --- tests/{magicuri => magicuri.py} | 0 tests/test_conn.py | 4 ++++ tests/utils.py | 27 +++++++++++++++---------- virtinst/connection.py | 13 ++++++------ virtinst/uri.py | 36 +++++++++------------------------ 5 files changed, 36 insertions(+), 44 deletions(-) rename tests/{magicuri => magicuri.py} (100%) diff --git a/tests/magicuri b/tests/magicuri.py similarity index 100% rename from tests/magicuri rename to tests/magicuri.py diff --git a/tests/test_conn.py b/tests/test_conn.py index becf381fe..1f6b3585c 100644 --- a/tests/test_conn.py +++ b/tests/test_conn.py @@ -40,6 +40,10 @@ class TestConn(unittest.TestCase): assert conn.get_uri_transport() == "tls" + # Hit fakuuri validation error, for old style opts + with self.assertRaises(RuntimeError): + cli.getConnection(fakeuri + ",qemu") + @unittest.mock.patch.dict(os.environ, {"LIBVIRT_DEFAULT_URI": "test:///default"}) def test_default_uri(self): diff --git a/tests/utils.py b/tests/utils.py index 43fe15865..90f41f523 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -60,34 +60,39 @@ class _URIs(object): _testtmpl = "__virtinst_test__test://%s,predictable" self.test_default = _testtmpl % "/default" - self.test_full = _testtmpl % (os.getcwd() + "/tests/testdriver.xml") self.test_suite = _testtmpl % (os.getcwd() + "/tests/testsuite.xml") - self.test_remote = self.test_full + ",remote" self.test_defaultpool_collision = (_testtmpl % (os.getcwd() + "/tests/data/cli/testdriver-defaultpool-collision.xml")) - self.xen = self.test_full + _caps("xen-rhel5.4.xml") + ",xen" - self.lxc = self.test_full + _caps("lxc.xml") + ",lxc" - self.vz = self.test_full + _caps("vz.xml") + ",vz" + self.test_full = _testtmpl % (os.getcwd() + "/tests/testdriver.xml") + def _m(fakeuri): + return self.test_full + ",fakeuri=%s" % fakeuri + self.test_remote = _m("test+tls://fakeuri.example.com/") - _uri_qemu = "%s,qemu" % self.test_full - _uri_kvm = _uri_qemu + _domcaps("kvm-x86_64-domcaps.xml") + self.xen = _m("xen:///") + _caps("xen-rhel5.4.xml") + self.lxc = _m("lxc:///") + _caps("lxc.xml") + self.vz = _m("vz:///") + _caps("vz.xml") + + _uri_qemu = _m("qemu:///system") + _kvm_x86_caps = _caps("kvm-x86_64.xml") + _domcaps("kvm-x86_64-domcaps.xml") + self.kvm = _uri_qemu + _kvm_x86_caps + self.kvm_remote = _m("qemu+tls://fakeuri.example.com/system") + _kvm_x86_caps + self.kvm_session = _m("qemu:///session") + _kvm_x86_caps + + _uri_kvm = _uri_qemu + _kvm_x86_caps _uri_kvm_rhel7 = _uri_qemu + _domcaps("kvm-x86_64-rhel7-domcaps.xml") _uri_kvm_q35 = _uri_qemu + _domcaps("kvm-x86_64-domcaps-q35.xml") _uri_kvm_amd_sev = _uri_qemu + _domcaps("kvm-x86_64-domcaps-amd-sev.xml") _uri_kvm_aarch64 = _uri_qemu + _domcaps("kvm-aarch64-domcaps.xml") _uri_qemu_riscv64 = _uri_qemu + _domcaps("qemu-riscv64-domcaps.xml") - self.kvm = _uri_kvm + _caps("kvm-x86_64.xml") - self.kvm_remote = _uri_kvm + _caps("kvm-x86_64.xml") + ",remote" self.kvm_nodomcaps = _uri_qemu + _caps("kvm-x86_64.xml") self.kvm_rhel = _uri_kvm_rhel7 + _caps("kvm-x86_64-rhel7.xml") self.kvm_q35 = _uri_kvm_q35 + _caps("kvm-x86_64.xml") self.kvm_amd_sev = _uri_kvm_amd_sev + _caps("kvm-x86_64.xml") - self.kvm_session = self.kvm + ",session" - self.kvm_armv7l = _uri_kvm + _caps("kvm-armv7l.xml") self.kvm_armv7l_nodomcaps = _uri_qemu + _caps("kvm-armv7l.xml") + self.kvm_armv7l = self.kvm_armv7l_nodomcaps + _domcaps("kvm-x86_64-domcaps.xml") self.kvm_aarch64 = _uri_kvm_aarch64 + _caps("kvm-aarch64.xml") self.kvm_ppc64le = _uri_kvm + _caps("kvm-ppc64le.xml") self.kvm_s390x = _uri_kvm + _caps("kvm-s390x.xml") diff --git a/virtinst/connection.py b/virtinst/connection.py index 9a39a93c7..b36368d84 100644 --- a/virtinst/connection.py +++ b/virtinst/connection.py @@ -58,11 +58,9 @@ class VirtinstConnection(object): if MagicURI.uri_is_magic(_initial_uri): self._magic_uri = MagicURI(_initial_uri) self._open_uri = self._magic_uri.open_uri - self._uri = self._magic_uri.make_fake_uri() + self._uri = self._magic_uri.fakeuri or self._open_uri self._fake_conn_predictable = self._magic_uri.predictable - self._fake_conn_remote = self._magic_uri.remote - self._fake_conn_session = self._magic_uri.session self._fake_conn_version = self._magic_uri.conn_version self._fake_libvirt_version = self._magic_uri.libvirt_version else: @@ -71,8 +69,6 @@ class VirtinstConnection(object): self._uri = _initial_uri self._fake_conn_predictable = False - self._fake_conn_remote = False - self._fake_conn_session = False self._fake_libvirt_version = None self._fake_conn_version = None @@ -143,6 +139,9 @@ class VirtinstConnection(object): return bool(self._libvirtconn) def open(self, authcb, cbdata): + if self._magic_uri: + self._magic_uri.validate() + # Mirror the set of libvirt.c virConnectCredTypeDefault valid_auth_options = [ libvirt.VIR_CRED_AUTHNAME, @@ -339,9 +338,9 @@ class VirtinstConnection(object): ################### def is_remote(self): - return (self._fake_conn_remote or self._uriobj.hostname) + return self._uriobj.hostname def is_session_uri(self): - return (self._fake_conn_session or self.get_uri_path() == "/session") + return self.get_uri_path() == "/session" def get_uri_hostname(self): return self._uriobj.hostname diff --git a/virtinst/uri.py b/virtinst/uri.py index cc1fb96b5..370771771 100644 --- a/virtinst/uri.py +++ b/virtinst/uri.py @@ -105,8 +105,7 @@ class MagicURI(object): * 'predictable': Generate predictable UUIDs, MAC addresses, and temporary file names. - * 'remote': Have the code consider this as a remote URI - * 'session': Have the code consider this as a session URI + * 'fakeuri': The URI to advertise as the actual connection URI * 'connver=%d': Override the connection (hv) version * 'libver=%d': Override the libvirt version * 'caps=%s': Points to a file with capabilities XML, that will @@ -114,7 +113,6 @@ class MagicURI(object): files in test/capabilities-xml/ * 'domcaps=%s': Points to a file with domain capabilities XML, that will be returned in conn.getDomainCapabilities - * qemu, xen, lxc or vz: Fake the specified hypervisor See tests/utils.py for example URLs """ @@ -140,46 +138,32 @@ class MagicURI(object): return ret self.predictable = pop_bool("predictable") - self.remote = pop_bool("remote") - self.session = pop_bool("session") + self.fakeuri = opts.pop("fakeuri", None) self.capsfile = opts.pop("caps", None) self.domcapsfile = opts.pop("domcaps", None) - self.hv = None - if pop_bool("qemu"): - self.hv = "qemu" - if pop_bool("lxc"): - self.hv = "lxc" - if pop_bool("xen"): - self.hv = "xen" - if pop_bool("vz"): - self.hv = "vz" - self.conn_version = opts.pop("connver", None) if self.conn_version: self.conn_version = int(self.conn_version) - elif self.hv: + elif self.fakeuri: self.conn_version = 10000000000 self.libvirt_version = opts.pop("libver", None) if self.libvirt_version: self.libvirt_version = int(self.libvirt_version) - assert not opts + self._err = None + if opts: + self._err = "MagicURI has unhandled opts=%s" % opts ############## # Public API # ############## - def make_fake_uri(self): - """ - If self.hv is set, we need to make a fake URI so that Connection - URI handling bits have something to work with. - """ - if self.hv: - return self.hv + "+abc:///system" - return self.open_uri + def validate(self): + if self._err: + raise RuntimeError(self._err) def overwrite_conn_functions(self, conn): """ @@ -209,7 +193,7 @@ class MagicURI(object): conn.getDomainCapabilities = fake_domcaps - if self.hv: + if self.fakeuri: origcreate = conn.createXML origdefine = conn.defineXML def newcreate(xml, flags):