mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-28 01:58:08 +03:00
tests: uitests: More createvm testing
Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
parent
01eb65bd61
commit
eb605cccd8
@ -29,6 +29,13 @@ class NewVM(uiutils.UITestCase):
|
||||
if check:
|
||||
uiutils.check_in_loop(lambda: pagenumlabel.text != oldtext)
|
||||
|
||||
def back(self, newvm, check=True):
|
||||
pagenumlabel = newvm.find("pagenum-label")
|
||||
oldtext = pagenumlabel.text
|
||||
newvm.find_fuzzy("Back", "button").click()
|
||||
if check:
|
||||
uiutils.check_in_loop(lambda: pagenumlabel.text != oldtext)
|
||||
|
||||
|
||||
##############
|
||||
# Test cases #
|
||||
@ -62,8 +69,8 @@ class NewVM(uiutils.UITestCase):
|
||||
entry.click()
|
||||
|
||||
# Back up, select test:///default, verify media-combo is now empty
|
||||
self.back(newvm)
|
||||
back = newvm.find_fuzzy("Back", "button")
|
||||
back.click()
|
||||
uiutils.check_in_loop(lambda: not back.sensitive)
|
||||
combo.click()
|
||||
combo.find_fuzzy("test default").click()
|
||||
@ -99,7 +106,7 @@ class NewVM(uiutils.UITestCase):
|
||||
|
||||
# Verify back+forward still keeps Generic selected
|
||||
self.sleep(.5)
|
||||
newvm.find_fuzzy("Back", "button").click()
|
||||
self.back(newvm)
|
||||
self.sleep(.5)
|
||||
self.forward(newvm)
|
||||
self.sleep(.5)
|
||||
@ -236,19 +243,21 @@ class NewVM(uiutils.UITestCase):
|
||||
url = "https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/10/Fedora/x86_64/os/"
|
||||
oslabel = "Fedora 10"
|
||||
newvm.find("install-url-entry").text = url
|
||||
newvm.find("install-urlopts-expander").click_expander()
|
||||
newvm.find("install-urlopts-entry").text = "foo=bar"
|
||||
|
||||
uiutils.check_in_loop(lambda: osentry.text == oslabel, timeout=10)
|
||||
|
||||
# Move forward, then back, ensure OS stays selected
|
||||
self.forward(newvm)
|
||||
newvm.find_fuzzy("Back", "button").click()
|
||||
self.back(newvm)
|
||||
uiutils.check_in_loop(lambda: osentry.text == oslabel)
|
||||
|
||||
# Disable autodetect, make sure OS still selected
|
||||
newvm.find_fuzzy("Automatically detect", "check").click()
|
||||
uiutils.check_in_loop(lambda: osentry.text == oslabel)
|
||||
self.forward(newvm)
|
||||
newvm.find_fuzzy("Back", "button").click()
|
||||
self.back(newvm)
|
||||
|
||||
# Ensure the EOL field was selected
|
||||
osentry.click()
|
||||
@ -296,19 +305,36 @@ class NewVM(uiutils.UITestCase):
|
||||
newvm.find("oslist-entry").text = "generic"
|
||||
newvm.find("oslist-popover").find_fuzzy("generic").click()
|
||||
self.forward(newvm, check=False)
|
||||
|
||||
# Path permission check
|
||||
alert = self.app.root.find("vmm dialog", "alert")
|
||||
alert.find_fuzzy("No", "push button").click()
|
||||
|
||||
self.forward(newvm)
|
||||
newvm.find_fuzzy("Finish", "button").click()
|
||||
|
||||
self.app.root.find_fuzzy("vm-ppc64 on", "frame")
|
||||
self.assertFalse(newvm.showing)
|
||||
|
||||
def testNewVMAArch64UEFI(self):
|
||||
"""
|
||||
Test aarch64 UEFI usage
|
||||
"""
|
||||
self.app.uri = tests.utils.URIs.kvm_aarch64
|
||||
newvm = self._open_create_wizard()
|
||||
|
||||
def testNewArmKernel(self):
|
||||
newvm.find_fuzzy("Local install media", "radio").click()
|
||||
self.forward(newvm)
|
||||
|
||||
newvm.find_fuzzy("Automatically detect", "check").click()
|
||||
newvm.find("oslist-entry").text = "generic"
|
||||
newvm.find("oslist-popover").find_fuzzy("generic").click()
|
||||
newvm.find("media-entry").text = "/dev/default-pool/testvol1.img"
|
||||
self.forward(newvm)
|
||||
self.forward(newvm)
|
||||
newvm.find_fuzzy("Enable storage", "check box").click()
|
||||
self.forward(newvm)
|
||||
newvm.find_fuzzy("Finish", "button").click()
|
||||
|
||||
self.app.root.find_fuzzy("vm1 on", "frame")
|
||||
self.assertFalse(newvm.showing)
|
||||
|
||||
def testNewVMArmKernel(self):
|
||||
"""
|
||||
New arm VM that requires kernel/initrd/dtb
|
||||
"""
|
||||
@ -323,11 +349,15 @@ class NewVM(uiutils.UITestCase):
|
||||
self.assertTrue(TCG.showing)
|
||||
|
||||
# Validate some initial defaults
|
||||
newvm.find_fuzzy("Virt Type", "combo").click()
|
||||
newvm.find_fuzzy("Import", "radio").click()
|
||||
newvm.find_fuzzy("Import", "radio").click()
|
||||
self.assertFalse(newvm.find_fuzzy("Local", "radio").sensitive)
|
||||
newvm.find_fuzzy("vexpress-a15", "menu item")
|
||||
newvm.find("virt", "menu item")
|
||||
newvm.find_fuzzy("Machine Type", "combo").click()
|
||||
self.sleep(.2)
|
||||
newvm.find_fuzzy("canon", "menu item").click()
|
||||
newvm.find_fuzzy("Machine Type", "combo").click()
|
||||
self.sleep(.2)
|
||||
newvm.find("virt", "menu item").click()
|
||||
self.forward(newvm)
|
||||
|
||||
# Set the import media details
|
||||
@ -343,10 +373,6 @@ class NewVM(uiutils.UITestCase):
|
||||
alert = self.app.root.find("vmm dialog", "alert")
|
||||
alert.find_fuzzy("Yes", "push button").click()
|
||||
|
||||
# Path permission check
|
||||
alert = self.app.root.find("vmm dialog", "alert")
|
||||
alert.find_fuzzy("No", "push button").click()
|
||||
|
||||
self.forward(newvm)
|
||||
newvm.find_fuzzy("Finish", "button").click()
|
||||
|
||||
@ -370,6 +396,11 @@ class NewVM(uiutils.UITestCase):
|
||||
"text", "application path").text = "/sbin/init"
|
||||
self.forward(newvm)
|
||||
self.forward(newvm)
|
||||
# Trigger back, to ensure disk page skipping works
|
||||
self.back(newvm)
|
||||
self.back(newvm)
|
||||
self.forward(newvm)
|
||||
self.forward(newvm)
|
||||
newvm.find_fuzzy("Finish", "button").click()
|
||||
|
||||
time.sleep(1)
|
||||
@ -420,6 +451,38 @@ class NewVM(uiutils.UITestCase):
|
||||
self.assertFalse(newvm.showing)
|
||||
|
||||
|
||||
def testNewVMContainerBootstrap(self):
|
||||
self.app.uri = tests.utils.URIs.lxc
|
||||
try:
|
||||
import virtBootstrap # pylint: disable=unused-import
|
||||
except ImportError:
|
||||
self.skipTest("virtBootstrap not installed")
|
||||
|
||||
newvm = self._open_create_wizard()
|
||||
newvm.find_fuzzy("Operating system", "radio").click()
|
||||
self.forward(newvm)
|
||||
|
||||
# Set directory path
|
||||
import tempfile
|
||||
tmpdir = tempfile.TemporaryDirectory()
|
||||
newvm.find_fuzzy("Create OS directory", "check box").click()
|
||||
self.sleep(.5)
|
||||
rootdir = newvm.find_fuzzy(None, "text", "root directory")
|
||||
self.assertTrue(".local/share/libvirt" in rootdir.text)
|
||||
rootdir.text = tmpdir.name
|
||||
newvm.find("install-oscontainer-source-uri").text = "docker://alpine"
|
||||
newvm.find("install-oscontainer-root-passwd").text = "foobar"
|
||||
self.forward(newvm)
|
||||
self.forward(newvm)
|
||||
newvm.find_fuzzy("Finish", "button").click()
|
||||
prog = self.app.root.find("Creating Virtual Machine", "frame")
|
||||
uiutils.check_in_loop(lambda: not prog.showing, timeout=30)
|
||||
|
||||
time.sleep(1)
|
||||
self.app.root.find_fuzzy("container1 on", "frame")
|
||||
self.assertFalse(newvm.showing)
|
||||
|
||||
|
||||
def testNewVMXenPV(self):
|
||||
"""
|
||||
Test the create wizard with a fake xen PV install
|
||||
@ -441,26 +504,49 @@ class NewVM(uiutils.UITestCase):
|
||||
self.forward(newvm)
|
||||
newvm.find_fuzzy("Finish", "button").click()
|
||||
|
||||
self.app.root.find_fuzzy("vm1 on", "frame")
|
||||
self.assertFalse(newvm.showing)
|
||||
|
||||
|
||||
def testNewVMInstallFail(self):
|
||||
newvm = self._open_create_wizard()
|
||||
newvm.find_fuzzy("Manual", "radio").click()
|
||||
self.forward(newvm)
|
||||
newvm.find("oslist-entry").text = "generic"
|
||||
newvm.find("oslist-popover").find_fuzzy("generic").click()
|
||||
self.forward(newvm)
|
||||
self.forward(newvm)
|
||||
self.forward(newvm)
|
||||
def dofail():
|
||||
_newvm = self._open_create_wizard()
|
||||
_newvm.find_fuzzy("Manual", "radio").click()
|
||||
self.forward(_newvm)
|
||||
_newvm.find("oslist-entry").text = "generic"
|
||||
_newvm.find("oslist-popover").find_fuzzy("generic").click()
|
||||
self.forward(_newvm)
|
||||
self.forward(_newvm)
|
||||
self.forward(_newvm)
|
||||
|
||||
# '/' in name will trigger libvirt error
|
||||
newvm.find_fuzzy("Name", "text").text = "test/bad"
|
||||
newvm.find_fuzzy("Finish", "button").click()
|
||||
alert = self.app.root.find("vmm dialog", "alert")
|
||||
alert.find_fuzzy("Unable to complete install")
|
||||
alert.find_fuzzy("Close", "button").click()
|
||||
# '/' in name will trigger libvirt error
|
||||
_newvm.find_fuzzy("Name", "text").text = "test/bad"
|
||||
_newvm.find_fuzzy("Finish", "button").click()
|
||||
alert = self.app.root.find("vmm dialog", "alert")
|
||||
alert.find_fuzzy("Unable to complete install")
|
||||
alert.find_fuzzy("Close", "button").click()
|
||||
return _newvm
|
||||
|
||||
newvm = dofail()
|
||||
|
||||
# Closing dialog should trigger storage cleanup path
|
||||
newvm.find_fuzzy("Cancel", "button").click()
|
||||
uiutils.check_in_loop(lambda: not newvm.visible)
|
||||
|
||||
# Run again
|
||||
newvm = dofail()
|
||||
self.back(newvm)
|
||||
newvm.find_fuzzy("Select or create", "radio").click()
|
||||
newvm.find("storage-entry").text = "/dev/default-pool/somenewvol1"
|
||||
self.forward(newvm)
|
||||
newvm.find_fuzzy("Name", "text").text = "test-foo"
|
||||
newvm.find_fuzzy("Finish", "button").click()
|
||||
|
||||
alert = self.app.root.find("vmm dialog")
|
||||
alert.find_fuzzy("Unable to complete install")
|
||||
|
||||
# self.app.root.find_fuzzy("test-foo on", "frame")
|
||||
# self.assertFalse(newvm.showing)
|
||||
|
||||
|
||||
def testNewVMCustomizeXMLEdit(self):
|
||||
|
@ -469,8 +469,7 @@ class VMMDogtailApp(object):
|
||||
cmd = [sys.executable]
|
||||
if tests.utils.clistate.use_coverage:
|
||||
cmd += ["-m", "coverage", "run", "--append",
|
||||
"--omit", "/usr/*",
|
||||
"--omit", "*/virtinst/*"]
|
||||
"--source", os.path.join(os.getcwd(), "virtManager")]
|
||||
cmd += [os.path.join(os.getcwd(), "virt-manager"),
|
||||
"--test-first-run",
|
||||
"--no-fork"]
|
||||
|
@ -955,6 +955,11 @@ bar</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="invisible_char">●</property>
|
||||
<child internal-child="accessible">
|
||||
<object class="AtkObject" id="install-urlopts-entry-atkobject">
|
||||
<property name="AtkObject::accessible-name" translatable="yes">install-urlopts-entry</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
@ -973,6 +978,11 @@ bar</property>
|
||||
<property name="use_underline">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<child internal-child="accessible">
|
||||
<object class="AtkObject" id="install-url-options-atkobject">
|
||||
<property name="AtkObject::accessible-name" translatable="yes">install-urlopts-expander</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
@ -1451,6 +1461,11 @@ connections is not yet supported.</small></property>
|
||||
* docker://registry:port/image:tag
|
||||
* virt-builder://template
|
||||
</property>
|
||||
<child internal-child="accessible">
|
||||
<object class="AtkObject" id="install-oscontainer-source-url-entry-atkobject">
|
||||
<property name="AtkObject::accessible-name" translatable="yes">install-oscontainer-source-uri</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
@ -1561,6 +1576,7 @@ connections is not yet supported.</small></property>
|
||||
<child>
|
||||
<object class="GtkBox" id="install-oscontainer-rootpw-box">
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">3</property>
|
||||
<child>
|
||||
@ -1581,6 +1597,11 @@ connections is not yet supported.</small></property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="visibility">False</property>
|
||||
<property name="invisible_char">●</property>
|
||||
<child internal-child="accessible">
|
||||
<object class="AtkObject" id="install-oscontainer-rootpw-atkobject">
|
||||
<property name="AtkObject::accessible-name" translatable="yes">install-oscontainer-root-passwd</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
|
@ -109,7 +109,7 @@ class vmmCreateVM(vmmGObjectUI):
|
||||
if not cls._instance:
|
||||
cls._instance = vmmCreateVM()
|
||||
cls._instance.show(parentobj and parentobj.topwin or None, uri=uri)
|
||||
except Exception as e:
|
||||
except Exception as e: # pragma: no cover
|
||||
if not parentobj:
|
||||
raise
|
||||
parentobj.err.show_err(
|
||||
@ -593,13 +593,10 @@ class vmmCreateVM(vmmGObjectUI):
|
||||
|
||||
# CPU
|
||||
phys_cpus = int(self.conn.host_active_processor_count())
|
||||
cmax = phys_cpus
|
||||
if cmax <= 0:
|
||||
cmax = 1
|
||||
cpu_label = (_("Up to %(numcpus)d available") %
|
||||
{'numcpus': int(phys_cpus)})
|
||||
cpu_label = ("<span size='small'>%s</span>" % cpu_label)
|
||||
self.widget("cpus").set_range(1, cmax)
|
||||
self.widget("cpus").set_range(1, max(phys_cpus, 1))
|
||||
self.widget("phys-cpu-label").set_markup(cpu_label)
|
||||
|
||||
# Storage
|
||||
@ -638,7 +635,7 @@ class vmmCreateVM(vmmGObjectUI):
|
||||
|
||||
try:
|
||||
self._populate_conn_state()
|
||||
except Exception as e:
|
||||
except Exception as e: # pragma: no cover
|
||||
log.exception("Error setting create wizard conn state.")
|
||||
return self._show_startup_error(str(e))
|
||||
|
||||
@ -689,7 +686,7 @@ class vmmCreateVM(vmmGObjectUI):
|
||||
|
||||
for guest in guests:
|
||||
if not guest.domains:
|
||||
continue
|
||||
continue # pragma: no cover
|
||||
|
||||
gtype = guest.os_type
|
||||
dom = guest.domains[0]
|
||||
@ -736,12 +733,11 @@ class vmmCreateVM(vmmGObjectUI):
|
||||
"s390x"]
|
||||
if self.conn.caps.host.cpu.arch not in prios:
|
||||
prios = []
|
||||
else:
|
||||
for p in prios[:]:
|
||||
if p not in archs:
|
||||
prios.remove(p)
|
||||
else:
|
||||
archs.remove(p)
|
||||
for p in prios[:]:
|
||||
if p not in archs:
|
||||
prios.remove(p)
|
||||
else:
|
||||
archs.remove(p)
|
||||
if prios:
|
||||
if archs:
|
||||
prios += [None]
|
||||
@ -1059,7 +1055,7 @@ class vmmCreateVM(vmmGObjectUI):
|
||||
self._failed_guest, meter)
|
||||
|
||||
def _cleanup_disks_finished(error, details):
|
||||
if error:
|
||||
if error: # pragma: no cover
|
||||
log.debug("Error cleaning up disk images:"
|
||||
"\nerror=%s\ndetails=%s", error, details)
|
||||
self.idle_add(self._close)
|
||||
@ -1194,7 +1190,7 @@ class vmmCreateVM(vmmGObjectUI):
|
||||
try:
|
||||
path, ignore = self._get_storage_path(newname, do_log=False)
|
||||
self._populate_summary_storage(path=path)
|
||||
except Exception:
|
||||
except Exception: # pragma: no cover
|
||||
log.debug("Error generating storage path on name change "
|
||||
"for name=%s", newname, exc_info=True)
|
||||
|
||||
@ -1226,10 +1222,9 @@ class vmmCreateVM(vmmGObjectUI):
|
||||
|
||||
# Auto-generate a path if not specified
|
||||
if enable_src and not self.widget("install-oscontainer-fs").get_text():
|
||||
if os.geteuid() == 0:
|
||||
fs_dir = ['/var/lib/libvirt/filesystems/']
|
||||
else:
|
||||
fs_dir = [os.environ['HOME'],
|
||||
fs_dir = ['/var/lib/libvirt/filesystems/']
|
||||
if os.geteuid() != 0:
|
||||
fs_dir = [os.path.expanduser("~"),
|
||||
'.local/share/libvirt/filesystems/']
|
||||
|
||||
default_name = virtinst.Guest.generate_name(self._guest)
|
||||
@ -1366,7 +1361,7 @@ class vmmCreateVM(vmmGObjectUI):
|
||||
if pagenum == PAGE_FINISH:
|
||||
try:
|
||||
self._populate_summary()
|
||||
except Exception as e:
|
||||
except Exception as e: # pragma: no cover
|
||||
self.err.show_err(_("Error populating summary page: %s") %
|
||||
str(e))
|
||||
return
|
||||
|
Loading…
x
Reference in New Issue
Block a user