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>
</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">&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>
</child>
</object>

View File

@ -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):

View File

@ -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)