createpool: Add more coverage testing

This commit is contained in:
Cole Robinson 2019-07-03 18:26:57 -04:00
parent 616a7f2dd5
commit aaa065d38e
9 changed files with 83 additions and 33 deletions

View File

@ -1,12 +1,12 @@
<volume type="file"> <volume type="file">
<name>pool-disk-volclone</name> <name>pool-disk-volclone</name>
<key>/some/target/path/pool-disk-vol</key> <key>/dev/pool-disk-vol</key>
<source> <source>
</source> </source>
<capacity unit="bytes">10737418240</capacity> <capacity unit="bytes">10737418240</capacity>
<allocation unit="bytes">5368709120</allocation> <allocation unit="bytes">5368709120</allocation>
<target> <target>
<path>/some/target/path/pool-disk-vol</path> <path>/dev/pool-disk-vol</path>
<format type="none"/> <format type="none"/>
<permissions> <permissions>
<mode>0700</mode> <mode>0700</mode>

View File

@ -4,6 +4,6 @@
<device path="/some/source/path"/> <device path="/some/source/path"/>
</source> </source>
<target> <target>
<path>/some/target/path</path> <path>/dev</path>
</target> </target>
</pool> </pool>

View File

@ -211,10 +211,6 @@ class TestStorage(unittest.TestCase):
diskvol.pool = diskpool diskvol.pool = diskpool
self.assertTrue(diskvol.supports_format() is False) self.assertTrue(diskvol.supports_format() is False)
diskpoolxml = StoragePool(fullconn)
diskpoolxml.type = "disk"
self.assertEqual(diskpoolxml.default_target_path(), "/dev")
glusterpool.destroy() glusterpool.destroy()
StoragePool.ensure_pool_is_running(glusterpool) StoragePool.ensure_pool_is_running(glusterpool)

View File

@ -24,10 +24,20 @@ class CreatePool(uiutils.UITestCase):
def testCreatePools(self): def testCreatePools(self):
hostwin = self._open_host_window("Storage") hostwin = self._open_host_window("Storage")
win = self._open_create_win(hostwin) win = self._open_create_win(hostwin)
# Create a simple default dir pool
finish = win.find("Finish", "push button") finish = win.find("Finish", "push button")
name = win.find("Name:", "text") name = win.find("Name:", "text")
def _browse_local_path(winlabel, usepath):
chooser = self.app.root.find(winlabel, "file chooser")
# Enter the filename and select it
chooser.find(usepath, "table cell").click()
obutton = chooser.find("Open", "push button")
uiutils.check_in_loop(lambda: obutton.sensitive)
obutton.click()
uiutils.check_in_loop(lambda: not chooser.showing)
uiutils.check_in_loop(lambda: win.active)
# Create a simple default dir pool
self.assertEqual(name.text, "pool") self.assertEqual(name.text, "pool")
newname = "a-test-new-pool" newname = "a-test-new-pool"
name.text = newname name.text = newname
@ -58,6 +68,39 @@ class CreatePool(uiutils.UITestCase):
# Ensure it's gone # Ensure it's gone
uiutils.check_in_loop(lambda: cell.dead) uiutils.check_in_loop(lambda: cell.dead)
# Test a disk pool
win = self._open_create_win(hostwin)
typ = win.find("Type:", "combo box")
newname = "a-disk-pool"
name.text = "a-disk-pool"
typ.click()
win.find_fuzzy("Physical Disk", "menu item").click()
win.find("source-browse").click()
_browse_local_path("Choose source path", "console")
finish.click()
hostwin.find(newname, "table cell")
# Test a iscsi pool
win = self._open_create_win(hostwin)
typ = win.find("Type:", "combo box")
newname = "a-iscsi-pool"
name.text = "a-iscsi-pool"
typ.click()
win.find_fuzzy("iSCSI", "menu item").click()
win.find("target-browse").click()
_browse_local_path("Choose target directory", "by-path")
finish.click()
# Catch example error
alert = self.app.root.find("vmm dialog", "alert")
alert.find_fuzzy("source host name", "label")
alert.find("Close", "push button").click()
win.find("Host Name:", "text").text = "example.com"
win.find("pool-source-path-text").text = "foo-iqn"
win.find_fuzzy("Initiator IQN:", "check").click()
win.find("iqn-text", "text").text = "initiator-foo"
finish.click()
hostwin.find(newname, "table cell")
# Test a logical pool # Test a logical pool
win = self._open_create_win(hostwin) win = self._open_create_win(hostwin)
typ = win.find("Type:", "combo box") typ = win.find("Type:", "combo box")

View File

@ -19,7 +19,7 @@
<devices> <devices>
<emulator>/usr/lib/xen/bin/qemu-dm</emulator> <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
<disk type="file" device="disk"> <disk type="file" device="disk">
<source file="/dev/null"/> <source file="/dev/foo/null"/>
<target dev="hda" bus="usb" removable="on"/> <target dev="hda" bus="usb" removable="on"/>
<serial>frob</serial> <serial>frob</serial>
<driver name="test" type="raw"/> <driver name="test" type="raw"/>

View File

@ -372,7 +372,7 @@ class XMLParseTest(unittest.TestCase):
disk = _get_disk("hda") disk = _get_disk("hda")
check = self._make_checker(disk) check = self._make_checker(disk)
check("path", "/tmp/test.img", "/dev/null") check("path", "/tmp/test.img", "/dev/foo/null")
disk.sync_path_props() disk.sync_path_props()
check("driver_name", None, "test") check("driver_name", None, "test")
check("driver_type", None, "raw") check("driver_type", None, "raw")

View File

@ -133,6 +133,11 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="invisible_char">●</property> <property name="invisible_char">●</property>
<property name="width_chars">25</property> <property name="width_chars">25</property>
<child internal-child="accessible">
<object class="AtkObject" id="pool-iqn-atkobject">
<property name="AtkObject::accessible-name">iqn-text</property>
</object>
</child>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
@ -192,7 +197,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">end</property> <property name="halign">end</property>
<property name="label">_sourcep:</property> <property name="label">_Sourcep:</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="mnemonic_widget">pool-source-path</property> <property name="mnemonic_widget">pool-source-path</property>
</object> </object>
@ -224,6 +229,11 @@
<property name="halign">start</property> <property name="halign">start</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<signal name="clicked" handler="on_pool_target_button_clicked" swapped="no"/> <signal name="clicked" handler="on_pool_target_button_clicked" swapped="no"/>
<child internal-child="accessible">
<object class="AtkObject" id="pool-target-button-atkobject">
<property name="AtkObject::accessible-name">target-browse</property>
</object>
</child>
</object> </object>
<packing> <packing>
<property name="left_attach">2</property> <property name="left_attach">2</property>
@ -239,6 +249,11 @@
<property name="halign">start</property> <property name="halign">start</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<signal name="clicked" handler="on_pool_source_button_clicked" swapped="no"/> <signal name="clicked" handler="on_pool_source_button_clicked" swapped="no"/>
<child internal-child="accessible">
<object class="AtkObject" id="pool-source-button-atkobject">
<property name="AtkObject::accessible-name">source-browse</property>
</object>
</child>
</object> </object>
<packing> <packing>
<property name="left_attach">2</property> <property name="left_attach">2</property>
@ -254,6 +269,11 @@
<object class="GtkEntry"> <object class="GtkEntry">
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="width_chars">25</property> <property name="width_chars">25</property>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-name">pool-source-path-text</property>
</object>
</child>
</object> </object>
</child> </child>
<child internal-child="accessible"> <child internal-child="accessible">
@ -273,7 +293,6 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="invisible_char">●</property> <property name="invisible_char">●</property>
<property name="width_chars">25</property> <property name="width_chars">25</property>
<signal name="activate" handler="on_pool_hostname_activate" swapped="no"/>
</object> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>

View File

@ -43,7 +43,6 @@ class vmmCreatePool(vmmGObjectUI):
"on_pool_source_button_clicked": self._browse_source_cb, "on_pool_source_button_clicked": self._browse_source_cb,
"on_pool_target_button_clicked": self._browse_target_cb, "on_pool_target_button_clicked": self._browse_target_cb,
"on_pool_hostname_activate": self._hostname_changed_cb,
"on_pool_iqn_chk_toggled": self._iqn_toggled_cb, "on_pool_iqn_chk_toggled": self._iqn_toggled_cb,
}) })
self.bind_escape_key_close() self.bind_escape_key_close()
@ -175,16 +174,13 @@ class vmmCreatePool(vmmGObjectUI):
try: try:
plist = StoragePool.pool_list_from_sources( plist = StoragePool.pool_list_from_sources(
self.conn.get_backend(), pool_type) self.conn.get_backend(), pool_type)
except Exception: except Exception: # pragma: no cover
log.exception("Pool enumeration failed") log.exception("Pool enumeration failed")
return plist return plist
def _get_build_default(self, pooltype): def _get_build_default(self, pooltype):
""" Return (default value, whether build option can be changed)""" """ Return (default value, whether build option can be changed)"""
if not pooltype:
return (False, False)
if pooltype in [StoragePool.TYPE_DIR, if pooltype in [StoragePool.TYPE_DIR,
StoragePool.TYPE_FS, StoragePool.TYPE_FS,
StoragePool.TYPE_NETFS]: StoragePool.TYPE_NETFS]:
@ -240,6 +236,7 @@ class vmmCreatePool(vmmGObjectUI):
elif is_scsi: elif is_scsi:
src_label = _("_Source Adapter:") src_label = _("_Source Adapter:")
self.widget("pool-source-label").set_text(src_label) self.widget("pool-source-label").set_text(src_label)
self.widget("pool-source-label").set_use_underline(True)
if tgt: if tgt:
self.widget("pool-target-path").set_text( self.widget("pool-target-path").set_text(
@ -267,10 +264,7 @@ class vmmCreatePool(vmmGObjectUI):
if column is None: if column is None:
return widget.get_text().strip() return widget.get_text().strip()
ret = uiutil.get_list_selection(widget, column=column) return uiutil.get_list_selection(widget, column=column)
if ret is not None:
return ret
return widget_name.get_child().get_text().strip()
def _get_config_pool_type(self): def _get_config_pool_type(self):
return uiutil.get_list_selection(self.widget("pool-type")) return uiutil.get_list_selection(self.widget("pool-type"))
@ -393,9 +387,8 @@ class vmmCreatePool(vmmGObjectUI):
try: try:
if self._validate(pool) is False: if self._validate(pool) is False:
return return
except Exception as e: except Exception as e: # pragma: no cover
return self.err.show_err( return self.err.show_err(_("Error validating pool: %s") % e)
_("Error validating pool: %s") % e)
self.reset_finish_cursor() self.reset_finish_cursor()
@ -444,9 +437,5 @@ class vmmCreatePool(vmmGObjectUI):
if target: if target:
self.widget("pool-target-path").set_text(target) self.widget("pool-target-path").set_text(target)
def _hostname_changed_cb(self, src):
# If a hostname was entered, try to lookup valid pool sources.
self._populate_pool_sources()
def _iqn_toggled_cb(self, src): def _iqn_toggled_cb(self, src):
self.widget("pool-iqn").set_sensitive(src.get_active()) self.widget("pool-iqn").set_sensitive(src.get_active())

View File

@ -232,8 +232,6 @@ class StoragePool(_StorageObject):
self.type == self.TYPE_FS): self.type == self.TYPE_FS):
return os.path.join( return os.path.join(
_preferred_default_pool_path(self.conn), self.name) _preferred_default_pool_path(self.conn), self.name)
if self.type == self.TYPE_DISK:
return _DEFAULT_DEV_TARGET
if self.type == self.TYPE_ISCSI or self.type == self.TYPE_SCSI: if self.type == self.TYPE_ISCSI or self.type == self.TYPE_SCSI:
return _DEFAULT_SCSI_TARGET return _DEFAULT_SCSI_TARGET
if self.type == self.TYPE_MPATH: if self.type == self.TYPE_MPATH:
@ -309,7 +307,7 @@ class StoragePool(_StorageObject):
def supports_target_path(self): def supports_target_path(self):
return self.type in [ return self.type in [
self.TYPE_DIR, self.TYPE_FS, self.TYPE_NETFS, self.TYPE_DIR, self.TYPE_FS, self.TYPE_NETFS,
self.TYPE_DISK, self.TYPE_ISCSI, self.TYPE_ISCSI,
self.TYPE_SCSI, self.TYPE_MPATH] self.TYPE_SCSI, self.TYPE_MPATH]
def supports_source_name(self): def supports_source_name(self):
@ -357,7 +355,12 @@ class StoragePool(_StorageObject):
self.validate_name(self.conn, self.name) self.validate_name(self.conn, self.name)
if not self.target_path: if not self.target_path:
self.target_path = self.default_target_path() if self.type == self.TYPE_DISK:
# disk is a bit special, in that it demands a target path,
# but basically can't handle anything other than /dev
self.target_path = _DEFAULT_DEV_TARGET
else:
self.target_path = self.default_target_path()
if not self.source_name: if not self.source_name:
self.source_name = self.default_source_name() self.source_name = self.default_source_name()
if not self.format and self.supports_format(): if not self.format and self.supports_format():