[virt-tools-list] [virt-manager PATCH 2/2] host: Show details about the network of SR-IOV VF pool

Lin Ma lma at suse.com
Fri Sep 22 11:39:10 UTC 2017


Signed-off-by: Lin Ma <lma at suse.com>
---
 ui/host.ui             | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++
 virtManager/host.py    | 54 ++++++++++++++++++++++++++++
 virtManager/network.py | 12 +++++++
 3 files changed, 164 insertions(+)

diff --git a/ui/host.ui b/ui/host.ui
index 2e5ea49..66435ff 100644
--- a/ui/host.ui
+++ b/ui/host.ui
@@ -1117,6 +1117,104 @@
                                     <property name="position">3</property>
                                   </packing>
                                 </child>
+                                <child>
+                                  <object class="GtkExpander" id="net-sriov-vf-pool-expander">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <child>
+                                      <object class="GtkBox" id="vbox19">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="orientation">vertical</property>
+                                        <property name="spacing">3</property>
+                                        <child>
+                                          <object class="GtkGrid" id="table21">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="row_spacing">5</property>
+                                            <property name="column_spacing">6</property>
+                                            <child>
+                                              <object class="GtkLabel" id="pf_name">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="halign">start</property>
+                                                <property name="label">label</property>
+                                                <property name="selectable">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="top_attach">0</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel" id="label80">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="halign">start</property>
+                                                <property name="label" translatable="yes">Physical Function:</property>
+                                              </object>
+                                              <packing>
+                                                <property name="left_attach">0</property>
+                                                <property name="top_attach">0</property>
+                                              </packing>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkLabel" id="label83">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="halign">start</property>
+                                            <property name="label" translatable="yes">Virtual Functions:</property>
+                                            <property name="use_markup">True</property>
+                                          </object>
+                                          <packing>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkScrolledWindow" id="vf-scroll">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="shadow_type">in</property>
+                                            <property name="height_request">144</property>
+                                            <child>
+                                              <object class="GtkTreeView" id="vf-list">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <child internal-child="selection">
+                                                  <object class="GtkTreeSelection" id="treeview-selection"/>
+                                                </child>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">True</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">2</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child type="label">
+                                      <object class="GtkLabel" id="label67">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="label" translatable="yes"><b>_VF pool information</b></property>
+                                        <property name="use_markup">True</property>
+                                        <property name="use_underline">True</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">4</property>
+                                  </packing>
+                                </child>
                               </object>
                             </child>
                           </object>
diff --git a/virtManager/host.py b/virtManager/host.py
index 84e8865..eceae51 100644
--- a/virtManager/host.py
+++ b/virtManager/host.py
@@ -167,6 +167,42 @@ class vmmHost(vmmGObjectUI):
         self.widget("net-list").append_column(netCol)
         netListModel.set_sort_column_id(1, Gtk.SortType.ASCENDING)
 
+        # Virtual Function list
+        # [type, domain, bus, slot, function]
+        vf_list = self.widget("vf-list")
+        vf_list_model = Gtk.ListStore(str, str, str, str, str)
+        vf_list.set_model(vf_list_model)
+
+        vfTypeCol = Gtk.TreeViewColumn(_("Type"))
+        vf_txt1 = Gtk.CellRendererText()
+        vfTypeCol.pack_start(vf_txt1, True)
+        vfTypeCol.add_attribute(vf_txt1, 'text', 0)
+        vf_list.append_column(vfTypeCol)
+
+        vfDomainCol = Gtk.TreeViewColumn(_("Domain"))
+        vf_txt2 = Gtk.CellRendererText()
+        vfDomainCol.pack_start(vf_txt2, False)
+        vfDomainCol.add_attribute(vf_txt2, 'text', 1)
+        vf_list.append_column(vfDomainCol)
+
+        vfBusCol = Gtk.TreeViewColumn(_("Bus"))
+        vf_txt3 = Gtk.CellRendererText()
+        vfBusCol.pack_start(vf_txt3, False)
+        vfBusCol.add_attribute(vf_txt3, 'text', 2)
+        vf_list.append_column(vfBusCol)
+
+        vfSlotCol = Gtk.TreeViewColumn(_("Slot"))
+        vf_txt4 = Gtk.CellRendererText()
+        vfSlotCol.pack_start(vf_txt4, False)
+        vfSlotCol.add_attribute(vf_txt4, 'text', 3)
+        vf_list.append_column(vfSlotCol)
+
+        vfFunctionCol = Gtk.TreeViewColumn(_("Function"))
+        vf_txt5 = Gtk.CellRendererText()
+        vfFunctionCol.pack_start(vf_txt5, False)
+        vfFunctionCol.add_attribute(vf_txt5, 'text', 4)
+        vf_list.append_column(vfFunctionCol)
+
     def init_storage_state(self):
         self.storagelist = vmmStorageList(self.conn, self.builder, self.topwin)
         self.widget("storage-align").add(self.storagelist.top_box)
@@ -398,6 +434,7 @@ class vmmHost(vmmGObjectUI):
             return
 
         logging.debug("Stopping network '%s'", net.get_name())
+        self.widget("vf-list").get_model().clear()
         vmmAsyncJob.simple_async_noshow(net.stop, [], self,
                             _("Error stopping network '%s'") % net.get_name())
 
@@ -613,6 +650,22 @@ class vmmHost(vmmGObjectUI):
         self.widget("qos-outbound-peak").set_text(qos.outbound_peak or "")
         self.widget("qos-outbound-burst").set_text(qos.outbound_burst or "")
 
+    def _populate_sriov_vf_pool_state(self, net):
+        (is_vf_pool, pf_name, addresses) = net.get_sriov_vf_pool_network()
+
+        self.widget("net-sriov-vf-pool-expander").set_visible(is_vf_pool)
+        if not pf_name:
+            self.widget("pf_name").set_text("N/A")
+            return
+
+        self.widget("pf_name").set_text(pf_name)
+
+        self.widget("vf-list").get_model().clear()
+        vf_list_model = self.widget("vf-list").get_model()
+        for addr in addresses:
+            vf_list_model.append([addr.type, addr.domain, addr.bus, addr.slot,
+                                  addr.function])
+
     def populate_net_state(self, net):
         active = net.is_active()
 
@@ -642,6 +695,7 @@ class vmmHost(vmmGObjectUI):
         self._populate_net_ipv4_state(net)
         self._populate_net_ipv6_state(net)
         self._populate_qos_state(net)
+        self._populate_sriov_vf_pool_state(net)
 
 
     def reset_net_state(self):
diff --git a/virtManager/network.py b/virtManager/network.py
index cb26049..a9dff0a 100644
--- a/virtManager/network.py
+++ b/virtManager/network.py
@@ -182,3 +182,15 @@ class vmmNetwork(vmmLibvirtObject):
     def get_ipv6_network(self):
         ret = self._get_network("ipv6")
         return ret + [self._get_static_route("ipv6")]
+
+    def get_sriov_vf_pool_network(self):
+        xmlobj = self.get_xmlobj()
+        pf_name = None
+        addresses = None
+        ret = False
+        if xmlobj.forward.mode == "hostdev":
+            ret = True
+            if xmlobj.forward.pf:
+                pf_name = xmlobj.forward.pf[0].dev
+                addresses = xmlobj.forward.addresses
+        return (ret, pf_name, addresses)
-- 
2.9.2




More information about the virt-tools-list mailing list