Use dummy interface

When using nova-network, dummy interface has to be used for Nova private
interfaces, because otherwice 'lo' interface is being used. Using 'lo'
is not requirement and it worked on older platform, but does not work
on CentOS7 and newest Fedora releases during spawning instances following
error appears:

TRACE nova.openstack.common.threadgroup NovaException:
Failed to add interface: can't add lo to bridge br100: Invalid argument

Change-Id: Iea3cf2b0e85af642523154bed933f11d19650504
Resolves-bug: rhbz#1153128
Resolves-bug: #1376596
Resolves-bug: #1477681
This commit is contained in:
Martin Mágr
2015-07-28 16:12:46 +02:00
parent 24b33f0924
commit 8947ee3b31
2 changed files with 43 additions and 8 deletions

View File

@@ -748,9 +748,9 @@ def single_step_aio_install(options, logFile):
if not options.novanetwork_pubif:
options.novanetwork_pubif = utils.device_from_ip(options.install_hosts)
if not options.novacompute_privif:
options.novacompute_privif = "lo"
options.novacompute_privif = ''
if not options.novanetwork_privif:
options.novanetwork_privif = "lo"
options.novanetwork_privif = ''
# If we are doing an all-in-one install, do demo provisioning
# unless specifically told not to

View File

@@ -164,8 +164,8 @@ def initConfig(controller):
"PROMPT": ("Enter the Private interface for Flat DHCP on the Nova"
" compute servers"),
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": secondary_netif,
"VALIDATORS": [],
"DEFAULT_VALUE": '',
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_NOVA_COMPUTE_PRIVIF",
@@ -201,8 +201,8 @@ def initConfig(controller):
"PROMPT": ("Enter the Private interface for network manager on "
"the Nova network server"),
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": secondary_netif,
"VALIDATORS": [],
"DEFAULT_VALUE": '',
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_NOVA_NETWORK_PRIVIF",
@@ -402,6 +402,36 @@ def bring_up_ifcfg(host, device):
raise ScriptRuntimeError(msg)
def dummy_interface(host):
"""Creates dummy interface on given hosts.
Returns interface name.
"""
# Only single dummy interface will be created, hence the name is hardcoded
ifname = 'dummy'
script = (
'DEVICE={0}\n'
'BOOTPROTO=none\n'
'ONBOOT=yes\n'
'TYPE=Ethernet\n'
'NM_CONTROLLED=no\n'.format(ifname)
)
server = utils.ScriptRunner(host)
server.append(
'ip link show {ifname} || ('
'modprobe dummy && '
'ip link set name {ifname} dev dummy0 && '
'ip link set dev dummy address 06:66:DE:AF:66:60'
')'.format(**locals())
)
server.append(
'cat > /etc/sysconfig/network-scripts/ifcfg-{ifname} '
'<<EOF\n{script}EOF'.format(**locals())
)
server.execute()
return ifname
# ------------------------ Step Functions -------------------------
def create_ssh_keys(config, messages):
@@ -570,12 +600,15 @@ def create_compute_manifest(config, messages):
if host not in network_hosts:
manifestdata += getManifestTemplate('nova_compute_flat')
key = 'CONFIG_NOVA_COMPUTE_PRIVIF'
if not config[key].strip():
config[key] = dummy_interface(host)
if config['CONFIG_USE_SUBNETS'] == 'y':
netface = common.cidr_to_ifname(
config['CONFIG_NOVA_COMPUTE_PRIVIF'], host, config
config[key], host, config
)
else:
netface = config['CONFIG_NOVA_COMPUTE_PRIVIF']
netface = config[key]
check_ifcfg(host, netface)
try:
bring_up_ifcfg(host, netface)
@@ -633,6 +666,8 @@ def create_network_manifest(config, messages):
config['CONFIG_NOVA_NETWORK_MULTIHOST'] = multihost and 'true' or 'false'
for host in network_hosts:
for i in ('CONFIG_NOVA_NETWORK_PRIVIF', 'CONFIG_NOVA_NETWORK_PUBIF'):
if not config[i].strip():
config[i] = dummy_interface(host)
netface = config[i]
if config['CONFIG_USE_SUBNETS'] == 'y':
netface = common.cidr_to_ifname(netface, host, config)