diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-05-16 22:17:09 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-05-16 22:17:09 +0000 |
| commit | d6433ca852950d1e61b5f84c1647db041271aeff (patch) | |
| tree | d0e135bca787b0a5794e891b0f650887a520bd9f /nova/virt | |
| parent | be432da444b98f986318197b72769c3ee5d277b8 (diff) | |
| parent | 2807ea5464e610b4ac77d95f9216b86b5f36bde0 (diff) | |
Merge "Don't inject settings for dynamic network"
Diffstat (limited to 'nova/virt')
| -rw-r--r-- | nova/virt/netutils.py | 114 |
1 files changed, 103 insertions, 11 deletions
diff --git a/nova/virt/netutils.py b/nova/virt/netutils.py index d38197948..301fa3b09 100644 --- a/nova/virt/netutils.py +++ b/nova/virt/netutils.py @@ -4,6 +4,7 @@ # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # Copyright (c) 2010 Citrix Systems, Inc. +# Copyright 2013 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -25,6 +26,8 @@ import netaddr from oslo.config import cfg +from nova.network import model + CONF = cfg.CONF CONF.import_opt('use_ipv6', 'nova.netconf') CONF.import_opt('injected_network_template', 'nova.virt.disk.api') @@ -55,6 +58,91 @@ def get_ip_version(cidr): return int(net.version) +def get_non_legacy_network_template(network_info, use_ipv6=CONF.use_ipv6, + template=CONF.injected_network_template): + """A new version of get_injected_network_template that does not rely on + legacy network info. + + Returns a rendered network template for the given network_info. When + libvirt's dependency on using legacy network info for network config + injection goes away, this function can replace + get_injected_network_template entirely. + + :param network_info: + :py:meth:`~nova.network.manager.NetworkManager.get_instance_nw_info` + :param use_ipv6: If False, do not return IPv6 template information + even if an IPv6 subnet is present in network_info. + :param template: Path to the interfaces template file. + """ + if not (network_info and template): + return + + nets = [] + ifc_num = -1 + ipv6_is_available = False + + for vif in network_info: + if not vif['network'] or not vif['network']['subnets']: + continue + + network = vif['network'] + # NOTE(bnemec): The template only supports a single subnet per + # interface and I'm not sure how/if that can be fixed, so this + # code only takes the first subnet of the appropriate type. + subnet_v4 = [i for i in network['subnets'] if i['version'] == 4][0] + subnet_v6 = [i for i in network['subnets'] if i['version'] == 6] + if subnet_v6: + subnet_v6 = subnet_v6[0] + + ifc_num += 1 + + if (not network.get_meta('injected') or not subnet_v4['ips'] or + subnet_v4.get_meta('dhcp_server') is not None): + continue + + ip = subnet_v4['ips'][0] + address = ip['address'] + netmask = model.get_netmask(ip, subnet_v4) + gateway = '' + if subnet_v4['gateway']: + gateway = subnet_v4['gateway']['address'] + broadcast = str(subnet_v4.as_netaddr().broadcast) + dns = ' '.join([i['address'] for i in subnet_v4['dns']]) + # NOTE(bnemec): I don't think this code would handle a pure IPv6 + # environment properly, but I don't have such an environment in + # which to test/fix that. + address_v6 = None + gateway_v6 = None + netmask_v6 = None + have_ipv6 = (use_ipv6 and subnet_v6) + if have_ipv6: + if subnet_v6['ips']: + ipv6_is_available = True + ip_v6 = subnet_v6['ips'][0] + address_v6 = ip_v6['address'] + netmask_v6 = model.get_netmask(ip_v6, subnet_v6) + gateway_v6 = '' + if subnet_v6['gateway']: + gateway_v6 = subnet_v6['gateway']['address'] + + net_info = {'name': 'eth%d' % ifc_num, + 'address': address, + 'netmask': netmask, + 'gateway': gateway, + 'broadcast': broadcast, + 'dns': dns, + 'address_v6': address_v6, + 'gateway_v6': gateway_v6, + 'netmask_v6': netmask_v6, + } + nets.append(net_info) + + if not nets: + return + + return build_template(template, nets, ipv6_is_available) + + def get_injected_network_template(network_info, use_ipv6=CONF.use_ipv6, template=CONF.injected_network_template): """ @@ -62,17 +150,20 @@ def get_injected_network_template(network_info, use_ipv6=CONF.use_ipv6, :param network_info: :py:meth:`~nova.network.manager.NetworkManager.get_instance_nw_info` - - Note: this code actually depends on the legacy network_info, but will - convert the type itself if necessary. + :param use_ipv6: If False, do not return IPv6 template information + even if an IPv6 subnet is present in network_info. + :param template: Path to the interfaces template file. """ - if network_info is None: - return None + if not (network_info and template): + return - # the code below depends on the legacy 'network_info' - if hasattr(network_info, 'legacy'): - network_info = network_info.legacy() + # If we're passed new network_info, make use of it instead of forcing + # it to the legacy format required below. + if isinstance(network_info, model.NetworkInfo): + return get_non_legacy_network_template(network_info, + use_ipv6, + template) nets = [] ifc_num = -1 @@ -107,11 +198,12 @@ def get_injected_network_template(network_info, use_ipv6=CONF.use_ipv6, nets.append(net_info) if have_injected_networks is False: - return None + return + + return build_template(template, nets, ipv6_is_available) - if not template: - return None +def build_template(template, nets, ipv6_is_available): _late_load_cheetah() ifc_template = open(template).read() |
