From: Lin Ma <lma@xxxxxxxx> Signed-off-by: Lin Ma <lma@xxxxxxxx> Signed-off-by: Pavel Hrdina <phrdina@xxxxxxxxxx> --- Notes: Changes in v2: - renamed object IDs from generic ones to specific names - the list of VFs doesn't have a header and contains only VFs names instead of PCI addresses - renamed the "VF pool information" into "SR-IOV information" ui/host.ui | 102 +++++++++++++++++++++++++++++++++++++++++++++++++ virtManager/host.py | 46 ++++++++++++++++++++++ virtManager/network.py | 12 ++++++ 3 files changed, 160 insertions(+) diff --git a/ui/host.ui b/ui/host.ui index 2e5ea496..f5ea3905 100644 --- a/ui/host.ui +++ b/ui/host.ui @@ -1117,6 +1117,108 @@ <property name="position">3</property> </packing> </child> + <child> + <object class="GtkExpander" id="net-sriov-expander"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkBox" id="net-sriov-box"> + <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="pf-table"> + <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="pf-name-label"> + <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="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="vf-scroll-label"> + <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="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="vf-scroll"> + <property name="height_request">144</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="shadow_type">in</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="vf-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="net-sriov-expander-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>_SR-IOV 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 84e8865c..560bc0a6 100644 --- a/virtManager/host.py +++ b/virtManager/host.py @@ -24,6 +24,7 @@ from gi.repository import GObject from gi.repository import Gtk from virtinst import Interface +from virtinst import NodeDevice from virtinst import util from . import uiutil @@ -167,6 +168,20 @@ class vmmHost(vmmGObjectUI): self.widget("net-list").append_column(netCol) netListModel.set_sort_column_id(1, Gtk.SortType.ASCENDING) + # Virtual Function list + # [vf-name] + vf_list = self.widget("vf-list") + vf_list_model = Gtk.ListStore(str) + vf_list.set_model(vf_list_model) + vf_list.set_headers_visible(False) + + vfTextCol = Gtk.TreeViewColumn() + vf_txt = Gtk.CellRendererText() + vfTextCol.pack_start(vf_txt, True) + vfTextCol.add_attribute(vf_txt, 'text', 0) + vf_list.append_column(vfTextCol) + + 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 +413,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 +629,35 @@ 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_state(self, net): + (is_vf_pool, pf_name, vfs) = net.get_sriov_vf_networks() + + self.widget("net-sriov-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) + + vf_list_model = self.widget("vf-list").get_model() + vf_list_model.clear() + for vf in vfs: + addrStr = "%x:%x:%x.%x" % (vf.domain, vf.bus, vf.slot, vf.function) + pcidev = NodeDevice.lookupNodedevFromString(self.conn.get_backend(), + addrStr) + + vf_name = None + + netdevs = self.conn.filter_nodedevs("net") + for netdev in netdevs: + logging.debug(netdev.xmlobj.parent) + if pcidev.name == netdev.xmlobj.parent: + vf_name = netdev.xmlobj.interface + break + + vf_list_model.append([vf_name or addrStr]) + + def populate_net_state(self, net): active = net.is_active() @@ -642,6 +687,7 @@ class vmmHost(vmmGObjectUI): self._populate_net_ipv4_state(net) self._populate_net_ipv6_state(net) self._populate_qos_state(net) + self._populate_sriov_state(net) def reset_net_state(self): diff --git a/virtManager/network.py b/virtManager/network.py index cb260497..4c937e0e 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_networks(self): + xmlobj = self.get_xmlobj() + pf_name = None + vfs = None + ret = False + if xmlobj.forward.mode == "hostdev": + ret = True + if xmlobj.forward.pf: + pf_name = xmlobj.forward.pf[0].dev + vfs = xmlobj.forward.vfs + return (ret, pf_name, vfs) -- 2.13.6 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list