Create only required OVS bridges in compute nodes

Packstack currently configures the same set of OVS switches in network and compute
nodes. In some topologies neutron requires different OVS bridges in different nodes.
as br-ex only in network nodes and br-provider in all nodes for provider networks
or br-vlan for vlan-based tenant networks.

This patch add an additional parameter to packstack:

- CONFIG_NEUTRON_OVS_BRIDGE_COMPUTE

Which must be used to specify the list of bridges that must be created in the
compute nodes. Interfaces will be connected to these switches as specified in
CONFIG_NEUTRON_OVS_BRIDGE_IFACES parameter and mappings added as declared in
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS.

Closes-Bug: 1569360

Change-Id: I647ffc1e9bd2ced1be994997e097e3b641964b64
This commit is contained in:
Alfredo Moralejo 2016-04-15 08:53:14 -04:00 committed by David Moreau Simard
parent f451f9aa5a
commit f1e6288b33
5 changed files with 81 additions and 5 deletions

View File

@ -872,6 +872,9 @@ Neutron OVS agent config
**CONFIG_NEUTRON_OVS_BRIDGE_IFACES**
Comma-separated list of colon-separated Open vSwitch <bridge>:<interface> pairs. The interface will be added to the associated bridge. If you desire the bridge to be persistent a value must be added to this directive, also CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS must be set in order to create the proper port. This can be achieved from the command line by issuing the following command: packstack --allinone --os-neutron-ovs-bridge-mappings=ext-net:br-ex --os-neutron-ovs-bridge-interfaces=br-ex:eth0
**CONFIG_NEUTRON_OVS_BRIDGES_COMPUTE**
Comma-separated list of Open vSwitch bridges that must be created and connected to interfaces in compute nodes when flat or vlan type drivers are enabled. These bridges must exist in CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS and CONFIG_NEUTRON_OVS_BRIDGE_IFACES. Example: --os-neutron-ovs-bridges-compute=br-vlan --os-neutron-ovs-bridge-mappings="extnet:br-ex,physnet1:br-vlan" --os-neutron-ovs-bridge-interfaces="br-ex:eth1,br-vlan:eth2"
Neutron OVS agent config for tunnels
------------------------------------

View File

@ -85,3 +85,14 @@ def cidr_to_ifname(cidr, host, config):
break
result.append(':'.join(translated))
return ','.join(result)
# Function find_pair_with search in a list of "key:value" pairs, one
# containing the desired element as key (if index is 0), or value (if index
# is 1). It returns the pair if it's found or KeyError.
def find_pair_with(pairs_list, element, index):
for pair in pairs_list:
found_element = pair.split(':')[index].strip()
if found_element == element:
return pair
raise KeyError('Couldn\'t find element %s in %s.' % (element, pairs_list))

View File

@ -183,6 +183,22 @@ def initConfig(controller):
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "os-neutron-ovs-bridges-compute",
"PROMPT": ("Enter a comma separated list of bridges for the "
"Neutron OVS plugin in compute nodes. They must "
"be included in os-neutron-ovs-bridge-mappings and "
"os-neutron-ovs-bridge-interfaces."),
"OPTION_LIST": [],
"VALIDATORS": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_NEUTRON_OVS_BRIDGES_COMPUTE",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
],
"NEUTRON_OVS_AGENT_TUNNEL": [
@ -863,29 +879,55 @@ def create_l2_agent_manifests(config, messages):
# For example, the input string 'A, B' should formatted as '['A','B']'.
config["CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS"] = bm_arr
config["CONFIG_NEUTRON_OVS_BRIDGE_IFACES"] = []
# Bridge configuration and mappings for compute nodes can be different.
# Parameter CONFIG_NEUTRON_OVS_BRIDGES_COMPUTE contains the list of
# bridge names, included in bridge mappings and bridge interfaces, that
# must be created in compute nodes.
brd_arr_cmp = get_values(config["CONFIG_NEUTRON_OVS_BRIDGES_COMPUTE"])
if_arr_cmp = []
mapp_arr_cmp = []
for brd in brd_arr_cmp:
if_arr_cmp.append(common.find_pair_with(iface_arr, brd, 0))
mapp_arr_cmp.append(common.find_pair_with(bm_arr, brd, 1))
config["CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS_COMPUTE"] = mapp_arr_cmp
config["CONFIG_NEUTRON_OVS_BRIDGE_IFACES_COMPUTE"] = []
elif agent == "linuxbridge":
host_var = 'CONFIG_NEUTRON_LB_HOST'
template_name = 'neutron_lb_agent'
else:
raise KeyError("Unknown layer2 agent")
no_local_types = set(ovs_type) & set(['gre', 'vxlan', 'vlan', 'flat'])
no_tunnel_types = set(ovs_type) & set(['vlan', 'flat'])
for host in network_hosts | compute_hosts:
manifestfile = "%s_neutron.pp" % (host,)
manifestdata = "$cfg_neutron_ovs_host = '%s'\n" % host
# neutron ovs port only on network hosts
# NICs connected to OVS bridges can be required in network nodes if
# vlan, flat, vxlan or gre are enabled. For compute nodes, they are
# only required if vlan or flat are enabled.
if (
agent == "openvswitch" and (
(host in network_hosts and tunnel_types)
or 'vlan' in ovs_type)
(host in network_hosts and no_local_types)
or no_tunnel_types)
):
if config['CONFIG_USE_SUBNETS'] == 'y':
iface_arr = [
common.cidr_to_ifname(i, host, config) for i in iface_arr
]
if_arr_cmp = [
common.cidr_to_ifname(i, host, config) for i in if_arr_cmp
]
config["CONFIG_NEUTRON_OVS_BRIDGE_IFACES"] = iface_arr
config["CONFIG_NEUTRON_OVS_BRIDGE_IFACES_COMPUTE"] = if_arr_cmp
manifestdata += "$create_bridges = true\n"
else:
manifestdata += "$create_bridges = false\n"
is_network_host = str(host in network_hosts).lower()
manifestdata += "$network_host = %s\n" % is_network_host
manifestdata += getManifestTemplate(template_name)
appendManifestFile(manifestfile, manifestdata + "\n")
# Additional configurations required for compute hosts and

View File

@ -13,9 +13,17 @@ if $ovs_agent_vxlan_cfg_neut_ovs_tun_if != '' {
$localip = $cfg_neutron_ovs_host
}
if $network_host {
$bridge_ifaces_param = 'CONFIG_NEUTRON_OVS_BRIDGE_IFACES'
$bridge_mappings_param = 'CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS'
} else {
$bridge_ifaces_param = 'CONFIG_NEUTRON_OVS_BRIDGE_IFACES_COMPUTE'
$bridge_mappings_param = 'CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS_COMPUTE'
}
if $create_bridges {
$bridge_uplinks = hiera_array('CONFIG_NEUTRON_OVS_BRIDGE_IFACES')
$bridge_mappings = hiera_array('CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS')
$bridge_uplinks = hiera_array($bridge_ifaces_param)
$bridge_mappings = hiera_array($bridge_mappings_param)
} else {
$bridge_uplinks = []
$bridge_mappings = []

View File

@ -0,0 +1,12 @@
---
features:
- |
New parameter ``--os-neutron-ovs-bridges-compute`` has been introduced to
set the OVS bridges created and configured in compute nodes when vlan or
flat type drivers are enabled.
fixes:
- |
Before this patch, all defined OVS bridges were created in both network
and compute hosts. However, in certain topologies some bridges are only
required in network hosts.