[virt-tools-list] [virt-manager PATCH 2/2] details: Show ipv4 and ipv6 address in details page of interface
Lin Ma
lma at suse.com
Fri Aug 31 10:37:30 UTC 2018
If the interface's type is 'network', then code uses lease as one of
parameters of interface_addresses to get ipv4 and ipv6 address.
If the result is negative, then uses agent to try again, If the result
is still negative, uses arp for final try.
Signed-off-by: Lin Ma <lma at suse.com>
---
ui/details.ui | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++
virtManager/details.py | 59 +++++++++++++++++++++++++++++++++++++
2 files changed, 138 insertions(+)
diff --git a/ui/details.ui b/ui/details.ui
index 5a35a156..be29eb7a 100644
--- a/ui/details.ui
+++ b/ui/details.ui
@@ -4043,6 +4043,85 @@
<property name="top_attach">3</property>
</packing>
</child>
+ <child>
+ <object class="GtkButton" id="show-ip">
+ <property name="label">Show IP</property>
+ <property name="image">image6</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_network_show_ip_clicked" swapped="no"/>
+ <child>
+ <object class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-refresh</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">3</property>
+ <child>
+ <object class="GtkLabel" id="ipv4-label">
+ <property name="label" translatable="yes">IPv4:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="ipv4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="ipv6-label">
+ <property name="label" translatable="yes">IPv6:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="ipv6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
</object>
</child>
</object>
diff --git a/virtManager/details.py b/virtManager/details.py
index e670d21f..67c936b4 100644
--- a/virtManager/details.py
+++ b/virtManager/details.py
@@ -548,6 +548,7 @@ class vmmDetails(vmmGObjectUI):
EDIT_NET_MAC),
"on_network_link_state_checkbox_toggled": lambda *x: self.enable_apply(x,
EDIT_NET_LINKSTATE),
+ "on_network_show_ip_clicked": self.show_ip,
"on_sound_model_combo_changed": lambda *x: self.enable_apply(x,
@@ -1868,6 +1869,60 @@ class vmmDetails(vmmGObjectUI):
return self._insert_media(disk)
+ # Interface IP
+ def show_ip(self, src_ignore):
+ def agent_ready():
+ chardevs = self.vm.xmlobj.devices.channel
+ if chardevs:
+ for dev in chardevs:
+ if (dev.DEVICE_TYPE == "channel" and dev.type == "unix" and
+ dev.target_name == "org.qemu.guest_agent.0" and
+ dev.target_state == "connected"):
+ return True
+ return False
+
+ if not self.vm.is_active():
+ self.widget("ipv4").set_text("N/A")
+ self.widget("ipv6").set_text("N/A")
+ return
+
+ net = self.get_hw_selection(HW_LIST_COL_DEVICE)
+ if not net:
+ return
+
+ macaddr = net.macaddr or ""
+
+ if net.type == "network":
+ addrinfo = self.vm.interface_addresses(
+ libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE, macaddr)
+ if addrinfo and (addrinfo["ipv4"] or addrinfo["ipv6"]):
+ self.widget("ipv4").set_text(addrinfo['ipv4'] if
+ addrinfo['ipv4'] else "N/A")
+ self.widget("ipv6").set_text(addrinfo['ipv6'] if
+ addrinfo['ipv6'] else "N/A")
+ return
+ if agent_ready() is True:
+ addrinfo = self.vm.interface_addresses(
+ libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_AGENT, macaddr)
+ if addrinfo and (addrinfo["ipv4"] or addrinfo["ipv6"]):
+ self.widget("ipv4").set_text(addrinfo['ipv4']
+ if addrinfo['ipv4'] else "N/A")
+ self.widget("ipv6").set_text(addrinfo['ipv6'] if
+ addrinfo['ipv6'] else "N/A")
+ return
+ addrinfo = self.vm.interface_addresses(
+ libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_ARP, macaddr)
+ if addrinfo and (addrinfo["ipv4"] or addrinfo["ipv6"]):
+ self.widget("ipv4").set_text(addrinfo['ipv4'] if addrinfo['ipv4']
+ else "N/A")
+ self.widget("ipv6").set_text(addrinfo['ipv6'] if addrinfo['ipv6']
+ else "N/A")
+ return
+
+ self.widget("ipv4").set_text("N/A")
+ self.widget("ipv6").set_text("N/A")
+
+
##################################################
# Details/Hardware config changes (apply button) #
##################################################
@@ -2727,6 +2782,10 @@ class vmmDetails(vmmGObjectUI):
state = net.link_state == "up" or net.link_state is None
self.widget("network-link-state-checkbox").set_active(state)
+ if len(self.vm.xmlobj.devices.interface) > 1:
+ self.widget("ipv4").set_text("")
+ self.widget("ipv6").set_text("")
+
self.netlist.set_dev(net)
def refresh_input_page(self):
--
2.15.1
More information about the virt-tools-list
mailing list