Change in vdsm[ovirt-3.6]: netinfo: rework reporting of DHCPv4/6 on network devices
osvoboda at redhat.com
osvoboda at redhat.com
Thu Nov 12 15:51:20 UTC 2015
Hello Ido Barkan, Dan Kenigsberg,
I'd like you to do a code review. Please visit
https://gerrit.ovirt.org/48513
to review the following change.
Change subject: netinfo: rework reporting of DHCPv4/6 on network devices
......................................................................
netinfo: rework reporting of DHCPv4/6 on network devices
This patch addresses the same problem [1] as commit b92edb but
hopefully in a more readable, verbose way.
[1] DHCP still being reported for hours after a network got static
IP configuration, because reporting is based on dhclient's leases.
Change-Id: Iaffdc836f8f64ecdc0a7e37ef50c228032f99696
Bug-Url: https://bugzilla.redhat.com/1184497
Signed-off-by: Ondřej Svoboda <osvoboda at redhat.com>
Reviewed-on: https://gerrit.ovirt.org/46430
Continuous-Integration: Jenkins CI
Reviewed-by: Ido Barkan <ibarkan at redhat.com>
Reviewed-by: Dan Kenigsberg <danken at redhat.com>
---
M lib/vdsm/netinfo.py
1 file changed, 49 insertions(+), 22 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/13/48513/1
diff --git a/lib/vdsm/netinfo.py b/lib/vdsm/netinfo.py
index 227b435..f1932ee 100644
--- a/lib/vdsm/netinfo.py
+++ b/lib/vdsm/netinfo.py
@@ -442,10 +442,6 @@
else:
try:
if family == 4:
- # Read dhcpv4 from an associated network's reported information
- if 'dhcpv4' in net_attrs:
- return net_attrs['dhcpv4']
- # Read the same information from RunningConfig
return net_attrs['bootproto'] == 'dhcp'
else:
return net_attrs['dhcpv6']
@@ -490,14 +486,6 @@
return data
-def _netinfo_by_device(networks):
- netinfo_by_device = {}
- for net_attrs in networks.itervalues():
- device = net_attrs['iface']
- netinfo_by_device[device] = net_attrs
- return netinfo_by_device
-
-
def _bridgeinfo(link):
return {'ports': ports(link.name),
'stp': bridge_stp_state(link.name),
@@ -536,7 +524,7 @@
return {'iface': link.device, 'vlanid': link.vlanid}
-def _devinfo(link, routes, ipaddrs, dhcpv4_ifaces, dhcpv6_ifaces, net_attrs):
+def _devinfo(link, routes, ipaddrs, dhcpv4_ifaces, dhcpv6_ifaces):
ipv4addr, ipv4netmask, ipv4addrs, ipv6addrs = getIpInfo(link.name, ipaddrs)
info = {'addr': ipv4addr,
'cfg': getIfaceCfg(link.name),
@@ -544,14 +532,54 @@
'ipv6addrs': ipv6addrs,
'gateway': _get_gateway(routes, link.name),
'ipv6gateway': _get_gateway(routes, link.name, family=6),
- 'dhcpv4': _dhcp_used(link.name, dhcpv4_ifaces, net_attrs),
- 'dhcpv6': _dhcp_used(link.name, dhcpv6_ifaces, net_attrs,
- family=6),
+ 'dhcpv4': link.name in dhcpv4_ifaces, # to be refined if a network
+ 'dhcpv6': link.name in dhcpv6_ifaces, # is not configured for DHCP
'mtu': str(link.mtu),
'netmask': ipv4netmask}
if 'BOOTPROTO' not in info['cfg']:
info['cfg']['BOOTPROTO'] = 'dhcp' if info['dhcpv4'] else 'none'
return info
+
+
+def _propose_updates_to_reported_dhcp(network_info, networking):
+ """
+ Report DHCPv4/6 of a network's topmost device based on the network's
+ configuration, to fix bug #1184497 (DHCP still being reported for hours
+ after a network got static IP configuration, as reporting is based on
+ dhclient leases).
+ """
+ updated_networking = dict(bondings={}, bridges={}, nics={}, vlans={})
+ network_device = network_info['iface']
+
+ for devices in ('bridges', 'vlans', 'bondings', 'nics'):
+ dev_info = networking[devices].get(network_device)
+ if dev_info:
+ cfg = {}
+ updated_networking[devices][network_device] = {
+ 'dhcpv4': network_info['dhcpv4'],
+ 'dhcpv6': network_info['dhcpv6'],
+ 'cfg': cfg,
+ }
+ cfg['BOOTPROTO'] = 'dhcp' if network_info['dhcpv4'] else 'none'
+ break
+
+ return updated_networking
+
+
+def _update_reported_dhcp(replacement, networking):
+ """
+ For each network device (representing a network), apply updates to reported
+ DHCP-related fields, as prepared by _propose_updates_to_reported_dhcp.
+ """
+ for device_type, devices in replacement.iteritems():
+ for device_name, replacement_device_info in devices.iteritems():
+ device_info = networking[device_type][device_name]
+ device_info['dhcpv4'] = replacement_device_info['dhcpv4']
+ device_info['dhcpv6'] = replacement_device_info['dhcpv6']
+ # Remove when cluster level < 3.6 is no longer supported and thus
+ # it is not necessary to report ifcfg-like BOOTPROTO field.
+ if replacement_device_info['cfg']:
+ device_info['cfg'].update(replacement_device_info['cfg'])
def _parse_expiry_time(expiry_time):
@@ -742,8 +770,6 @@
else:
networking['networks'] = vdsmnets
- netinfo_by_device = _netinfo_by_device(networking['networks'])
-
for dev in (link for link in getLinks() if not link.isHidden()):
if dev.isBRIDGE():
devinfo = networking['bridges'][dev.name] = _bridgeinfo(dev)
@@ -756,15 +782,16 @@
else:
continue
devinfo.update(_devinfo(dev, routes, ipaddrs, dhcpv4_ifaces,
- dhcpv6_ifaces,
- netinfo_by_device.get(dev.name, None)))
+ dhcpv6_ifaces))
if dev.isBOND():
_bondOptsCompat(devinfo)
_bondCustomOpts(dev, devinfo, running_config)
- for network, network_info in networking['networks'].iteritems():
+ for network_name, network_info in networking['networks'].iteritems():
if network_info['bridged']:
- network_info['cfg'] = networking['bridges'][network]['cfg']
+ network_info['cfg'] = networking['bridges'][network_name]['cfg']
+ updates = _propose_updates_to_reported_dhcp(network_info, networking)
+ _update_reported_dhcp(updates, networking)
return networking
--
To view, visit https://gerrit.ovirt.org/48513
To unsubscribe, visit https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iaffdc836f8f64ecdc0a7e37ef50c228032f99696
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: ovirt-3.6
Gerrit-Owner: Ondřej Svoboda <osvoboda at redhat.com>
Gerrit-Reviewer: Dan Kenigsberg <danken at redhat.com>
Gerrit-Reviewer: Ido Barkan <ibarkan at redhat.com>
More information about the vdsm-patches
mailing list