host: Show details about the network of SR-IOV VF pool

Signed-off-by: Lin Ma <lma@suse.com>
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Lin Ma 2017-09-22 19:39:10 +08:00 committed by Pavel Hrdina
parent 6dfc4de125
commit 083dfcc8ec
3 changed files with 160 additions and 0 deletions

View File

@ -1117,6 +1117,108 @@
<property name="position">3</property> <property name="position">3</property>
</packing> </packing>
</child> </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">&lt;b&gt;_SR-IOV information&lt;/b&gt;</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> </object>
</child> </child>
</object> </object>

View File

@ -24,6 +24,7 @@ from gi.repository import GObject
from gi.repository import Gtk from gi.repository import Gtk
from virtinst import Interface from virtinst import Interface
from virtinst import NodeDevice
from virtinst import util from virtinst import util
from . import uiutil from . import uiutil
@ -167,6 +168,20 @@ class vmmHost(vmmGObjectUI):
self.widget("net-list").append_column(netCol) self.widget("net-list").append_column(netCol)
netListModel.set_sort_column_id(1, Gtk.SortType.ASCENDING) 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): def init_storage_state(self):
self.storagelist = vmmStorageList(self.conn, self.builder, self.topwin) self.storagelist = vmmStorageList(self.conn, self.builder, self.topwin)
self.widget("storage-align").add(self.storagelist.top_box) self.widget("storage-align").add(self.storagelist.top_box)
@ -398,6 +413,7 @@ class vmmHost(vmmGObjectUI):
return return
logging.debug("Stopping network '%s'", net.get_name()) logging.debug("Stopping network '%s'", net.get_name())
self.widget("vf-list").get_model().clear()
vmmAsyncJob.simple_async_noshow(net.stop, [], self, vmmAsyncJob.simple_async_noshow(net.stop, [], self,
_("Error stopping network '%s'") % net.get_name()) _("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-peak").set_text(qos.outbound_peak or "")
self.widget("qos-outbound-burst").set_text(qos.outbound_burst 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): def populate_net_state(self, net):
active = net.is_active() active = net.is_active()
@ -642,6 +687,7 @@ class vmmHost(vmmGObjectUI):
self._populate_net_ipv4_state(net) self._populate_net_ipv4_state(net)
self._populate_net_ipv6_state(net) self._populate_net_ipv6_state(net)
self._populate_qos_state(net) self._populate_qos_state(net)
self._populate_sriov_state(net)
def reset_net_state(self): def reset_net_state(self):

View File

@ -182,3 +182,15 @@ class vmmNetwork(vmmLibvirtObject):
def get_ipv6_network(self): def get_ipv6_network(self):
ret = self._get_network("ipv6") ret = self._get_network("ipv6")
return ret + [self._get_static_route("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)