summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/uitests/test_addhardware.py11
-rw-r--r--tests/uitests/test_details.py10
-rw-r--r--ui/netlist.ui103
-rw-r--r--virtManager/createvm.py5
-rw-r--r--virtManager/details/details.py3
-rw-r--r--virtManager/device/netlist.py44
-rw-r--r--virtManager/object/domain.py4
7 files changed, 139 insertions, 41 deletions
diff --git a/tests/uitests/test_addhardware.py b/tests/uitests/test_addhardware.py
index 56acc2fa..8591d37c 100644
--- a/tests/uitests/test_addhardware.py
+++ b/tests/uitests/test_addhardware.py
@@ -353,6 +353,17 @@ def testAddNetworks(app):
tab.combo_select("Device model:", "virtio")
_finish(addhw, check=details)
+ # Portgroup
+ _open_addhw(app, details)
+ tab = _select_hw(addhw, "Network", "network-tab")
+ tab.find("MAC Address Field", "text").set_text("00:11:00:11:00:CC")
+ tab.combo_select("net-source", "Virtual network 'plainbridge-portgroups'")
+ c = tab.find_fuzzy("Portgroup:", "combo box")
+ c.click_combo_entry()
+ lib.utils.check(lambda: c.find("engineering", "menu item").selected)
+ c.find("engineering", "menu item").click()
+ _finish(addhw, check=details)
+
# Manual macvtap
_open_addhw(app, details)
tab = _select_hw(addhw, "Network", "network-tab")
diff --git a/tests/uitests/test_details.py b/tests/uitests/test_details.py
index 9bd0cace..eee83ac9 100644
--- a/tests/uitests/test_details.py
+++ b/tests/uitests/test_details.py
@@ -444,6 +444,16 @@ def testDetailsEditDiskNet(app):
appl.click()
lib.utils.check(lambda: not appl.sensitive)
+ # Portgroup
+ src.click()
+ tab.find_fuzzy("plainbridge-portgroups",
+ "menu item").bring_on_screen().click()
+ c = tab.find_fuzzy("Portgroup:", "combo box")
+ c.click_combo_entry()
+ c.find("sales").click()
+ appl.click()
+ lib.utils.check(lambda: not appl.sensitive)
+
def testDetailsNetIPAddress(app):
"""
diff --git a/ui/netlist.ui b/ui/netlist.ui
index f0cd135e..07be02e4 100644
--- a/ui/netlist.ui
+++ b/ui/netlist.ui
@@ -1,51 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.36.0 -->
+<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.22"/>
+ <!-- n-columns=2 n-rows=5 -->
<object class="GtkGrid" id="net-source-box">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
+ <property name="can-focus">False</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">6</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="halign">start</property>
<property name="hexpand">False</property>
<property name="label" translatable="yes">De_vice name:</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">net-manual-source</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">net-manual-source</property>
</object>
<packing>
- <property name="left_attach">0</property>
- <property name="top_attach">2</property>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="net-manual-source">
<property name="visible">True</property>
- <property name="can_focus">True</property>
+ <property name="can-focus">True</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<signal name="changed" handler="on_net_bridge_name_changed" swapped="no"/>
</object>
<packing>
- <property name="left_attach">1</property>
- <property name="top_attach">2</property>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="net-macvtap-warn-box">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="halign">start</property>
<property name="hexpand">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="stock">gtk-dialog-warning</property>
</object>
<packing>
@@ -57,12 +58,12 @@
<child>
<object class="GtkLabel" id="label19">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">&lt;small&gt;In most configurations, macvtap does not work for host to guest network communication.&lt;/small&gt;</property>
- <property name="use_markup">True</property>
+ <property name="use-markup">True</property>
<property name="wrap">True</property>
- <property name="max_width_chars">35</property>
+ <property name="max-width-chars">35</property>
</object>
<packing>
<property name="expand">False</property>
@@ -72,15 +73,15 @@
</child>
</object>
<packing>
- <property name="left_attach">0</property>
- <property name="top_attach">3</property>
+ <property name="left-attach">0</property>
+ <property name="top-attach">4</property>
<property name="width">2</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="net-source">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="halign">start</property>
<property name="hexpand">False</property>
<signal name="changed" handler="on_net_source_changed" swapped="no"/>
@@ -91,20 +92,20 @@
</child>
</object>
<packing>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
<property name="width">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="net-default-warn-box">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="stock">gtk-dialog-warning</property>
</object>
<packing>
@@ -116,12 +117,12 @@
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">&lt;small&gt;Failed to find a suitable default network.&lt;/small&gt;</property>
- <property name="use_markup">True</property>
+ <property name="use-markup">True</property>
<property name="wrap">True</property>
- <property name="max_width_chars">35</property>
+ <property name="max-width-chars">35</property>
</object>
<packing>
<property name="expand">False</property>
@@ -131,21 +132,55 @@
</child>
</object>
<packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
<property name="width">2</property>
</packing>
</child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">False</property>
+ <property name="label" translatable="yes">_Portgroup:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">net-portgroup</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="net-portgroup">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="has-entry">True</property>
+ <signal name="changed" handler="on_net_portgroup_changed" swapped="no"/>
+ <child internal-child="entry">
+ <object class="GtkEntry" id="combobox-entry2">
+ <property name="can-focus">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
</object>
<object class="GtkLabel" id="net-source-label">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="halign">end</property>
<property name="valign">start</property>
- <property name="margin_top">3</property>
- <property name="margin_bottom">3</property>
+ <property name="margin-top">3</property>
+ <property name="margin-bottom">3</property>
<property name="label" translatable="yes">_Network source:</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">net-source</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">net-source</property>
</object>
</interface>
diff --git a/virtManager/createvm.py b/virtManager/createvm.py
index d59818d6..92551182 100644
--- a/virtManager/createvm.py
+++ b/virtManager/createvm.py
@@ -979,9 +979,8 @@ class vmmCreateVM(vmmGObjectUI):
self.widget("summary-cpu").set_text(cpu)
self._populate_summary_storage()
- ignore0, nsource, ignore1 = self._netlist.get_network_selection()
- expand = not nsource
- if expand:
+ nsource = self._netlist.get_network_selection()[1]
+ if not nsource:
self.widget("advanced-expander").set_expanded(True)
diff --git a/virtManager/details/details.py b/virtManager/details/details.py
index d2eab535..d550276e 100644
--- a/virtManager/details/details.py
+++ b/virtManager/details/details.py
@@ -1573,7 +1573,8 @@ class vmmDetails(vmmGObjectUI):
kwargs["model"] = model
if self._edited(EDIT_NET_SOURCE):
- (kwargs["ntype"], kwargs["source"], kwargs["mode"]) = (
+ (kwargs["ntype"], kwargs["source"],
+ kwargs["mode"], kwargs["portgroup"]) = (
self.netlist.get_network_selection())
if self._edited(EDIT_NET_MAC):
diff --git a/virtManager/device/netlist.py b/virtManager/device/netlist.py
index 55fe5c2e..5136bf8b 100644
--- a/virtManager/device/netlist.py
+++ b/virtManager/device/netlist.py
@@ -67,6 +67,7 @@ class vmmNetworkList(vmmGObjectUI):
self.builder.connect_signals({
"on_net_source_changed": self._on_net_source_changed,
+ "on_net_portgroup_changed": self._emit_changed,
"on_net_bridge_name_changed": self._emit_changed,
})
@@ -101,6 +102,11 @@ class vmmNetworkList(vmmGObjectUI):
combo.add_attribute(text, 'text', NET_ROW_LABEL)
combo.add_attribute(text, 'sensitive', NET_ROW_SENSITIVE)
+ combo = self.widget("net-portgroup")
+ model = Gtk.ListStore(str)
+ combo.set_model(model)
+ uiutil.init_combo_text_column(combo, 0)
+
self.conn.connect("net-added", self._repopulate_network_list)
self.conn.connect("net-removed", self._repopulate_network_list)
@@ -281,10 +287,14 @@ class vmmNetworkList(vmmGObjectUI):
# This is generally the safest and most featureful default
mode = "bridge"
- return net_type, net_src, mode
+ portgroup = None
+ if self.widget("net-portgroup").is_visible():
+ portgroup = uiutil.get_list_selection(self.widget("net-portgroup"))
+
+ return net_type, net_src, mode, portgroup
def build_device(self, macaddr, model=None):
- nettype, devname, mode = self.get_network_selection()
+ nettype, devname, mode, portgroup = self.get_network_selection()
net = virtinst.DeviceInterface(self.conn.get_backend())
net.type = nettype
@@ -292,6 +302,7 @@ class vmmNetworkList(vmmGObjectUI):
net.macaddr = macaddr
net.model = model
net.source_mode = mode
+ net.portgroup = portgroup
return net
@@ -303,6 +314,7 @@ class vmmNetworkList(vmmGObjectUI):
def reset_state(self):
self.widget("net-default-warn-box").set_visible(False)
self.widget("net-manual-source").set_text("")
+ self.widget("net-portgroup").get_child().set_text("")
self._repopulate_network_list()
def set_dev(self, net):
@@ -313,6 +325,10 @@ class vmmNetworkList(vmmGObjectUI):
combo.set_active_iter(rowiter)
combo.emit("changed")
+ if net.portgroup:
+ uiutil.set_list_selection(
+ self.widget("net-portgroup"), net.portgroup)
+
#############
# Listeners #
@@ -350,6 +366,19 @@ class vmmNetworkList(vmmGObjectUI):
netlist.set_active(default_idx)
+ def _populate_portgroups(self, portgroups):
+ combo = self.widget("net-portgroup")
+ model = combo.get_model()
+ model.clear()
+
+ default = None
+ for p in portgroups:
+ model.append([p.name])
+ if p.default:
+ default = p.name
+
+ uiutil.set_list_selection(combo, default)
+
def _on_net_source_changed(self, src):
ignore = src
self._emit_changed()
@@ -359,9 +388,20 @@ class vmmNetworkList(vmmGObjectUI):
nettype = rowdata.nettype
is_direct = (nettype == virtinst.DeviceInterface.TYPE_DIRECT)
+ is_virtual = (nettype == virtinst.DeviceInterface.TYPE_VIRTUAL)
+
uiutil.set_grid_row_visible(
self.widget("net-macvtap-warn-box"), is_direct)
show_bridge = rowdata.manual
uiutil.set_grid_row_visible(
self.widget("net-manual-source"), show_bridge)
+
+ portgroups = []
+ if is_virtual:
+ net = self.conn.get_net_by_name(rowdata.source)
+ portgroups = net.get_xmlobj().portgroups
+
+ uiutil.set_grid_row_visible(
+ self.widget("net-portgroup"), bool(portgroups))
+ self._populate_portgroups(portgroups)
diff --git a/virtManager/object/domain.py b/virtManager/object/domain.py
index e1a02ba3..5bf66901 100644
--- a/virtManager/object/domain.py
+++ b/virtManager/object/domain.py
@@ -807,7 +807,8 @@ class vmmDomain(vmmLibvirtObject):
def define_network(self, devobj, do_hotplug,
ntype=_SENTINEL, source=_SENTINEL,
mode=_SENTINEL, model=_SENTINEL,
- macaddr=_SENTINEL, linkstate=_SENTINEL):
+ macaddr=_SENTINEL, linkstate=_SENTINEL,
+ portgroup=_SENTINEL):
xmlobj = self._make_xmlobj_to_define()
editdev = self._lookup_device_to_define(xmlobj, devobj, do_hotplug)
if not editdev:
@@ -819,6 +820,7 @@ class vmmDomain(vmmLibvirtObject):
editdev.type = ntype
editdev.source = source
editdev.source_mode = mode or None
+ editdev.portgroup = portgroup or None
if model != _SENTINEL:
if editdev.model != model: