[virt-tools-list] [PATCH 2/5] Add lxc filesystem drivers: loop and nbd

Cédric Bosdonnat cbosdonnat at suse.com
Tue Jan 21 09:05:29 UTC 2014


These file systems drivers have been added in virtinst, but also in the
addhardware UI.
---
 tests/xmlparse-xml/change-filesystems-in.xml  |  5 ++
 tests/xmlparse-xml/change-filesystems-out.xml |  6 ++
 tests/xmlparse.py                             |  9 +++
 ui/addhardware.ui                             | 76 ++++++++++++++++++++----
 virtManager/addhardware.py                    | 84 ++++++++++++++++++---------
 virtinst/devicefilesystem.py                  |  9 ++-
 6 files changed, 147 insertions(+), 42 deletions(-)

diff --git a/tests/xmlparse-xml/change-filesystems-in.xml b/tests/xmlparse-xml/change-filesystems-in.xml
index 9a96997..5cb8010 100644
--- a/tests/xmlparse-xml/change-filesystems-in.xml
+++ b/tests/xmlparse-xml/change-filesystems-in.xml
@@ -50,5 +50,10 @@
       <source dev='/foo/bar'/>
       <target dir='/bar/baz'/>
     </filesystem>
+    <filesystem type='file' accessmode='passthrough'>
+      <driver type='nbd' format='qcow'/>
+      <source file='/foo/bar.img'/>
+      <target dir='/bar/baz'/>
+    </filesystem>
   </devices>
 </domain>
diff --git a/tests/xmlparse-xml/change-filesystems-out.xml b/tests/xmlparse-xml/change-filesystems-out.xml
index 0662668..90fcf27 100644
--- a/tests/xmlparse-xml/change-filesystems-out.xml
+++ b/tests/xmlparse-xml/change-filesystems-out.xml
@@ -52,5 +52,11 @@
       <target dir="/bar/baz"/>
       <readonly/>
     </filesystem>
+    <filesystem type="file">
+      <driver type="loop" format="raw"/>
+      <source file="/foo/bar.raw"/>
+      <target dir="/bar/baz"/>
+      <readonly/>
+    </filesystem>
   </devices>
 </domain>
diff --git a/tests/xmlparse.py b/tests/xmlparse.py
index 173a47a..5e14968 100644
--- a/tests/xmlparse.py
+++ b/tests/xmlparse.py
@@ -608,6 +608,7 @@ class XMLParseTest(unittest.TestCase):
         dev4 = guest.get_devices("filesystem")[3]
         dev5 = guest.get_devices("filesystem")[4]
         dev6 = guest.get_devices("filesystem")[5]
+        dev7 = guest.get_devices("filesystem")[6]
 
         check = self._make_checker(dev1)
         check("type", None, "mount")
@@ -647,6 +648,14 @@ class XMLParseTest(unittest.TestCase):
         check("source", "/foo/bar", "/dev/new")
         check("readonly", False, True)
 
+        check = self._make_checker(dev7)
+        check("type", "file")
+        check("mode", "passthrough", None)
+        check("driver", "nbd", "loop")
+        check("format", "qcow", "raw")
+        check("source", "/foo/bar.img", "/foo/bar.raw")
+        check("readonly", False, True)
+
         self._alter_compare(guest.get_xml_config(), outfile)
 
     def testAlterSounds(self):
diff --git a/ui/addhardware.ui b/ui/addhardware.ui
index cd54086..1d8f17f 100644
--- a/ui/addhardware.ui
+++ b/ui/addhardware.ui
@@ -1802,7 +1802,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">1</property>
-                                <property name="top_attach">2</property>
+                                <property name="top_attach">3</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -1875,7 +1875,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">1</property>
-                                <property name="top_attach">3</property>
+                                <property name="top_attach">4</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -1888,7 +1888,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">1</property>
-                                <property name="top_attach">6</property>
+                                <property name="top_attach">7</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -1905,7 +1905,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">1</property>
-                                <property name="top_attach">7</property>
+                                <property name="top_attach">8</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -1945,7 +1945,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">1</property>
-                                <property name="top_attach">4</property>
+                                <property name="top_attach">5</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -1977,7 +1977,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">0</property>
-                                <property name="top_attach">2</property>
+                                <property name="top_attach">3</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -2009,7 +2009,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">0</property>
-                                <property name="top_attach">3</property>
+                                <property name="top_attach">4</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -2025,7 +2025,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">0</property>
-                                <property name="top_attach">4</property>
+                                <property name="top_attach">5</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -2041,7 +2041,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">0</property>
-                                <property name="top_attach">6</property>
+                                <property name="top_attach">7</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -2056,7 +2056,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">0</property>
-                                <property name="top_attach">7</property>
+                                <property name="top_attach">8</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -2072,7 +2072,7 @@
                               </object>
                               <packing>
                                 <property name="left_attach">0</property>
-                                <property name="top_attach">5</property>
+                                <property name="top_attach">6</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
@@ -2111,7 +2111,59 @@
                               </object>
                               <packing>
                                 <property name="left_attach">1</property>
-                                <property name="top_attach">5</property>
+                                <property name="top_attach">6</property>
+                                <property name="width">1</property>
+                                <property name="height">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="fs-format-title">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes">_Format:</property>
+                                <property name="use_underline">True</property>
+                                <property name="mnemonic_widget">fs-format-combo</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">0</property>
+                                <property name="top_attach">2</property>
+                                <property name="width">1</property>
+                                <property name="height">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="fs-format-box">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkComboBox" id="fs-format-combo">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="fs-format-label">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Default</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="top_attach">2</property>
                                 <property name="width">1</property>
                                 <property name="height">1</property>
                               </packing>
diff --git a/virtManager/addhardware.py b/virtManager/addhardware.py
index 3294fab..3807c3a 100644
--- a/virtManager/addhardware.py
+++ b/virtManager/addhardware.py
@@ -328,7 +328,15 @@ class vmmAddHardware(vmmGObjectUI):
             simple_store_set("fs-type-combo", [VirtualFilesystem.TYPE_MOUNT])
 
         simple_store_set("fs-mode-combo", VirtualFilesystem.MODES)
-        simple_store_set("fs-driver-combo", VirtualFilesystem.DRIVERS)
+        if self.conn.is_qemu():
+            simple_store_set("fs-driver-combo", [VirtualFilesystem.DRIVER_PATH,
+                                                 VirtualFilesystem.DRIVER_HANDLE,
+                                                 VirtualFilesystem.DRIVER_DEFAULT])
+        elif self.conn.is_lxc():
+            simple_store_set("fs-driver-combo", [VirtualFilesystem.DRIVER_LOOP,
+                                                 VirtualFilesystem.DRIVER_NBD,
+                                                 VirtualFilesystem.DRIVER_DEFAULT])
+        simple_store_set("fs-format-combo", VirtualFilesystem.NBD_FORMATS)
         simple_store_set("fs-wrpolicy-combo", VirtualFilesystem.WRPOLICIES)
         self.show_pair_combo("fs-type", self.conn.is_openvz() or self.conn.is_lxc())
         self.show_check_button("fs-readonly",
@@ -520,6 +528,7 @@ class vmmAddHardware(vmmGObjectUI):
         self.widget("fs-type-combo").set_active(0)
         self.widget("fs-mode-combo").set_active(0)
         self.widget("fs-driver-combo").set_active(0)
+        self.widget("fs-format-combo").set_active(0)
         self.widget("fs-wrpolicy-combo").set_active(0)
         self.widget("fs-source").set_text("")
         self.widget("fs-target").set_text("")
@@ -927,6 +936,14 @@ class vmmAddHardware(vmmGObjectUI):
 
         return combo.get_model()[combo.get_active()][0]
 
+    def get_config_fs_format(self):
+        name = "fs-format-combo"
+        combo = self.widget(name)
+        if not combo.get_visible():
+            return None
+
+        return combo.get_model()[combo.get_active()][0]
+
     def get_config_fs_units(self):
         name = "fs-ram-units-combo"
         combo = self.widget(name)
@@ -1308,22 +1325,42 @@ class vmmAddHardware(vmmGObjectUI):
     def browse_fs_source(self, ignore1):
         self._browse_file(self.widget("fs-source"), isdir=True)
 
-    def change_fs_type(self, src):
-        idx = src.get_active()
-        fstype = None
+    def update_fs_rows(self):
+        fstype = self.get_config_fs_type()
+        fsdriver = self.get_config_fs_driver()
+        ismount = bool(
+                fstype == VirtualFilesystem.TYPE_MOUNT or
+                self.conn.is_qemu())
+
+        show_mode = bool(ismount and
+            (fsdriver == VirtualFilesystem.DRIVER_PATH or
+            fsdriver == VirtualFilesystem.DRIVER_DEFAULT))
+        uihelpers.set_grid_row_visible(self.widget("fs-mode-box"), show_mode)
+
+        show_wrpol = bool(ismount and
+            fsdriver and (fsdriver == VirtualFilesystem.DRIVER_PATH or
+            fsdriver == VirtualFilesystem.DRIVER_HANDLE))
+        uihelpers.set_grid_row_visible(self.widget("fs-wrpolicy-box"),
+                                       show_wrpol)
+
+        show_ram_source = fstype == VirtualFilesystem.TYPE_RAM
+        uihelpers.set_grid_row_visible(self.widget("fs-ram-source-box"), show_ram_source)
+        uihelpers.set_grid_row_visible(self.widget("fs-source-box"), not show_ram_source)
+
+        show_format = bool(
+            fsdriver == VirtualFilesystem.DRIVER_NBD)
+        uihelpers.set_grid_row_visible(self.widget("fs-format-box"), show_format)
+        self.show_pair_combo("fs-format", True)
+
         show_mode_combo = False
         show_driver_combo = False
         show_wrpolicy_combo = self.conn.is_qemu()
-
-        if idx >= 0 and src.get_visible():
-            fstype = src.get_model()[idx][0]
-
-        if fstype == virtinst.VirtualFilesystem.TYPE_TEMPLATE:
+        if fstype == VirtualFilesystem.TYPE_TEMPLATE:
             source_text = _("Te_mplate:")
         else:
             source_text = _("_Source path:")
             show_mode_combo = self.conn.is_qemu()
-            show_driver_combo = self.conn.is_qemu()
+            show_driver_combo = self.conn.is_qemu() or self.conn.is_lxc()
 
         self.widget("fs-source-title").set_text(source_text)
         self.widget("fs-source-title").set_use_underline(True)
@@ -1331,25 +1368,11 @@ class vmmAddHardware(vmmGObjectUI):
         self.show_pair_combo("fs-driver", show_driver_combo)
         self.show_pair_combo("fs-wrpolicy", show_wrpolicy_combo)
 
-        show_ram_source = fstype == VirtualFilesystem.TYPE_RAM
-        uihelpers.set_grid_row_visible(self.widget("fs-ram-source-box"), show_ram_source)
-        uihelpers.set_grid_row_visible(self.widget("fs-source-box"), not show_ram_source)
-
-    def change_fs_driver(self, src):
-        fsdriver = None
-        idx = src.get_active()
-        if idx >= 0 and src.get_visible():
-            fsdriver = src.get_model()[idx][0]
+    def change_fs_type(self, ignore):
+        self.update_fs_rows()
 
-        show_mode = bool(
-            fsdriver == virtinst.VirtualFilesystem.DRIVER_PATH or
-            fsdriver == virtinst.VirtualFilesystem.DRIVER_DEFAULT)
-        uihelpers.set_grid_row_visible(self.widget("fs-mode-box"), show_mode)
-
-        show_wrpol = bool(
-            fsdriver and fsdriver != virtinst.VirtualFilesystem.DRIVER_DEFAULT)
-        uihelpers.set_grid_row_visible(self.widget("fs-wrpolicy-box"),
-                                       show_wrpol)
+    def change_fs_driver(self, ignore):
+        self.update_fs_rows()
 
     def change_ram_units(self, ignore):
         units = self.get_config_fs_units()
@@ -1804,6 +1827,7 @@ class vmmAddHardware(vmmGObjectUI):
         fstype = self.get_config_fs_type()
         readonly = self.get_config_fs_readonly()
         driver = self.get_config_fs_driver()
+        fsformat = self.get_config_fs_format()
         wrpolicy = self.get_config_fs_wrpolicy()
         units = self.get_config_fs_units()
 
@@ -1834,6 +1858,10 @@ class vmmAddHardware(vmmGObjectUI):
                 self._dev.readonly = readonly
             if driver:
                 self._dev.driver = driver
+                if driver == VirtualFilesystem.DRIVER_LOOP:
+                    self._dev.format = "raw"
+                elif driver == VirtualFilesystem.DRIVER_NBD:
+                    self._dev.format = fsformat
             if wrpolicy:
                 self._dev.wrpolicy = wrpolicy
         except Exception, e:
diff --git a/virtinst/devicefilesystem.py b/virtinst/devicefilesystem.py
index 46bb45f..2b1b0ba 100644
--- a/virtinst/devicefilesystem.py
+++ b/virtinst/devicefilesystem.py
@@ -46,9 +46,13 @@ class VirtualFilesystem(VirtualDevice):
 
     DRIVER_PATH = "path"
     DRIVER_HANDLE = "handle"
-    DRIVER_PROXY = "proxy"
+    DRIVER_LOOP = "loop"
+    DRIVER_NBD = "nbd"
     DRIVER_DEFAULT = "default"
-    DRIVERS = [DRIVER_PATH, DRIVER_HANDLE, DRIVER_PROXY, DRIVER_DEFAULT]
+    DRIVERS = [DRIVER_PATH, DRIVER_HANDLE, DRIVER_LOOP, DRIVER_NBD, DRIVER_DEFAULT]
+
+    NBD_FORMATS = ["raw", "bochs", "cloop", "cow", "dmg", "iso", "qcow",
+                   "qcow2", "qed", "vmdk", "vpc", "fat", "vhd", "vdi"]
 
     @staticmethod
     def type_to_source_prop(fs_type):
@@ -83,6 +87,7 @@ class VirtualFilesystem(VirtualDevice):
     driver = XMLProperty("./driver/@type",
                          default_cb=lambda s: None,
                          default_name=DRIVER_DEFAULT)
+    format = XMLProperty("./driver/@format")
 
     readonly = XMLProperty("./readonly", is_bool=True)
 
-- 
1.8.5.2




More information about the virt-tools-list mailing list