Preserve assigned MAC on subsequent invocations
Tenks/libvirt was not reusing the MAC address assigned when invoked repeatedly, which was leading to errors and confusion when extending an existing Tenks deployment. Check Ansible facts for a pre-existing interface and reuse the assigned MAC if one is found. Any existing MAC is added to the data structure returned by set_libvirt_interfaces. Change-Id: If45516d06d41992e7142ca8071ddcb84160a13e5
This commit is contained in:
parent
eb33405ae4
commit
b64f9adbc6
@ -68,6 +68,12 @@ def _get_hostvar(context, var_name, inventory_hostname=None):
|
|||||||
return namespace.get(var_name)
|
return namespace.get(var_name)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_fact(context, fact_name):
|
||||||
|
if fact_name not in context['ansible_facts']:
|
||||||
|
raise AnsibleFilterError("Fact '%s' not found" % fact_name)
|
||||||
|
return context['ansible_facts'][fact_name]
|
||||||
|
|
||||||
|
|
||||||
@pass_context
|
@pass_context
|
||||||
def set_libvirt_interfaces(context, node):
|
def set_libvirt_interfaces(context, node):
|
||||||
"""Set interfaces for a node's specified physical networks.
|
"""Set interfaces for a node's specified physical networks.
|
||||||
@ -76,11 +82,17 @@ def set_libvirt_interfaces(context, node):
|
|||||||
for physnet in node.get('physical_networks', []):
|
for physnet in node.get('physical_networks', []):
|
||||||
# Use macvtap 'passthrough' mode, since this does not filter packets
|
# Use macvtap 'passthrough' mode, since this does not filter packets
|
||||||
# based on MAC address of the interface.
|
# based on MAC address of the interface.
|
||||||
node['interfaces'].append(
|
if_name = source_link_name(context, node, physnet)
|
||||||
{'type': 'direct',
|
if_data = {'type': 'direct',
|
||||||
'source': {'dev': source_link_name(context, node, physnet),
|
'source': {'dev': if_name, 'mode': 'passthrough'}}
|
||||||
'mode': 'passthrough'}}
|
|
||||||
)
|
# Check for an existing interface. If found, pull in the existing MAC.
|
||||||
|
if_var = if_name.replace('-', '_')
|
||||||
|
if_fact = _get_fact(context, if_var)
|
||||||
|
if if_fact:
|
||||||
|
if_data['mac'] = if_fact['macaddress']
|
||||||
|
|
||||||
|
node['interfaces'].append(if_data)
|
||||||
return node
|
return node
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
Fixes an issue where tenks was regenerating the MAC addresses for the
|
||||||
|
network interfaces used by the backing virtual machines on each run. This
|
||||||
|
would lead to a mismatch between the MAC address set on the baremetal port
|
||||||
|
in Ironic and the MAC address of the virtual machine's network interface.
|
Loading…
Reference in New Issue
Block a user