Fix multirack support for the shared address pools

When the same address pool is used for VMs in different
groups with different l2_network_devices,
one of l2_network_devices (libvirt network) should be able
to configure DHCP options for the VMs from all the groups
for the used address pool; not only for the "default" group.

- fix shell command "slave-ip-list" when nodes use the same
  address pool but are from different groups
- fix the template option "l2_network_device" for address pool:
  always seek for "<group.name>_l2_network_device" instead of
  "l2_network_device", to avoid using the same IP address for
  different l2_network_devices in different groups
- fix DCHP configuration for libvirt network: find all the
  interfaces from all the l2_network_devices, which use the current
  address pool, to configure DHCP for all the nodes from all groups.

Change-Id: Ib0bb9e48a69699c81cbd2a89b1e06884c15d954c
This commit is contained in:
Dennis Dmitriev 2019-02-18 17:41:58 +02:00
parent 370af2910f
commit 94f424cb51
11 changed files with 55 additions and 40 deletions

View File

@ -614,19 +614,29 @@ class LibvirtL2NetworkDevice(network.L2NetworkDevice):
dhcp_range_end = None
addresses = []
if self.address_pool is not None:
# Reserved names 'l2_network_device' and 'dhcp'
ip_network_address = self.address_pool.get_ip('l2_network_device')
# Reserved name '<group.name>_l2_network_device'
ip_network_address = self.address_pool.get_ip(
str(self.group.name) + '_l2_network_device')
# Workaround for fuel-qa compatibility, if 'l2_network_device'
# address was not reserved in the YAML template
# Backward compatibility with existing templates
# where only one l2_network_device per address pool is used
if not ip_network_address:
ip_network_address = str(self.address_pool.ip_network[1])
ip_network_address = self.address_pool.get_ip(
'l2_network_device')
ip_network_prefixlen = str(self.address_pool.ip_network.prefixlen)
# Reserved name 'dhcp'
dhcp_range_start = self.address_pool.ip_range_start('dhcp')
dhcp_range_end = self.address_pool.ip_range_end('dhcp')
for interface in self.interfaces:
# Get all the interfaces that use the same self.address_pool
# to configure DHCP for all the nodes from all groups
l2devices = self.group.environment.get_env_l2_network_devices(
address_pool=self.address_pool)
ifaces = [iface for l2device in l2devices
for iface in l2device.interfaces]
for interface in ifaces:
for address in interface.addresses:
ip_addr = netaddr.IPAddress(address.ip_address)
if ip_addr in self.address_pool.ip_network:

View File

@ -363,7 +363,7 @@ def create_address_pools(interfaceorder, networks_pools):
# Gateway will be used for configure OpenStack networks
'gateway': 1,
# l2_network_device will be used for configure local bridge
'l2_network_device': 1,
'default_l2_network_device': 1,
},
'ip_ranges': {
'default': [2, -2],

View File

@ -59,7 +59,7 @@ class AddressPool(base.ParamedModel, base.BaseModel):
params:
ip_reserved:
gateway: 1
l2_network_device: 1 # l2_network_device will get the
default_l2_network_device: 1 # l2_network_device will get the
# IP address = 172.0.*.1 (net + 1)
ip_ranges:
default: [2, -2] # admin IP range for 'default' nodegroup name
@ -70,10 +70,12 @@ class AddressPool(base.ParamedModel, base.BaseModel):
vlan_start: 100
ip_reserved:
gateway: 12.34.56.1
l2_network_device: 12.34.56.62 # l2_network_device will be assumed
# with this IP address.
# It will be used for create libvirt
# network if libvirt driver is used.
# l2_network_device in the group "default"
# will be assumed with this IP address.
# It will be used for create libvirt
# network if libvirt driver is used.
default_l2_network_device: 12.34.56.62
ip_ranges:
default: [2, 127] # public IP range for 'default' nodegroup name
floating: [128, -2] # floating IP range
@ -83,21 +85,21 @@ class AddressPool(base.ParamedModel, base.BaseModel):
params:
vlan_start: 101
ip_reserved:
l2_network_device: 1 # 172.0.*.1
default_l2_network_device: 1 # 172.0.*.1
management-pool01:
net: 172.0.0.0/16:24
params:
vlan_start: 102
ip_reserved:
l2_network_device: 1 # 172.0.*.1
default_l2_network_device: 1 # 172.0.*.1
private-pool01:
net: 192.168.0.0/24:26
params:
vlan_start: 103
ip_reserved:
l2_network_device: 1 # 192.168.*.1
default_l2_network_device: 1 # 192.168.*.1
"""
class Meta(object):

View File

@ -321,7 +321,10 @@ class Shell(object):
node.name,
node.get_ip_address_by_network_name(l2dev.name)))
if ap_slave_ips:
slave_ips[l2dev.address_pool.name] = ap_slave_ips
if l2dev.address_pool.name in slave_ips:
slave_ips[l2dev.address_pool.name] += ap_slave_ips
else:
slave_ips[l2dev.address_pool.name] = ap_slave_ips
if not slave_ips:
sys.exit('No IPs were allocated for environment!')

View File

@ -89,7 +89,7 @@ template:
gateway: +1
# Libvirt bridge will get this IP address
l2_network_device: +1
default_l2_network_device: +1
# IP ranges, reserved in the address pool.
# - 'default' IP range stands for 'default' nodegroup in Fuel.
@ -109,7 +109,7 @@ template:
vlan_start: 0
ip_reserved:
gateway: +1
l2_network_device: +1 # l2_network_device will get this IP address
default_l2_network_device: +1 # l2_network_device will get this IP address
ip_ranges:
default: [+2, +127] # public IP range for 'default' nodegroup name
floating: [+128, -2]

View File

@ -36,7 +36,7 @@ template:
gateway: +1
# Libvirt bridge will get this IP address
l2_network_device: +1
rack-01_l2_network_device: +1
# IP ranges, reserved in the address pool.
# - 'default' IP range stands for 'default' nodegroup in Fuel.
@ -56,7 +56,7 @@ template:
vlan_start: 0
ip_reserved:
gateway: +1
l2_network_device: +1 # l2_network_device will get this IP address
rack-01_l2_network_device: +1 # l2_network_device will get this IP address
ip_ranges:
default: [+2, +127] # public IP range for 'default' nodegroup name
floating: [+128, -2]

View File

@ -48,7 +48,7 @@ template:
tag: 0
ip_reserved:
gateway: +1
l2_network_device: +1
rack-01_l2_network_device: +1
ip_ranges:
default: [+2, -2]
dhcp: [+2, -2]
@ -58,7 +58,7 @@ template:
tag: 0
ip_reserved:
gateway: +1
l2_network_device: +1
rack-01_l2_network_device: +1
ip_ranges:
default: [+2, +127]
floating: [+128, -2]
@ -67,19 +67,19 @@ template:
params:
tag: 101
ip_reserved:
l2_network_device: +1
rack-01_l2_network_device: +1
management-pool01:
net: *pool_default
params:
tag: 102
ip_reserved:
l2_network_device: +1
rack-01_l2_network_device: +1
private-pool01:
net: *pool_default
params:
tag: 103
ip_reserved:
l2_network_device: +1
rack-01_l2_network_device: +1
groups:
- name: rack-01

View File

@ -65,8 +65,8 @@ class TestDefaultTemplate(TestCase):
- 2
- -2
ip_reserved:
default_l2_network_device: 1
gateway: 1
l2_network_device: 1
management:
net: 10.109.0.0/16:24
params:
@ -75,8 +75,8 @@ class TestDefaultTemplate(TestCase):
- 2
- -2
ip_reserved:
default_l2_network_device: 1
gateway: 1
l2_network_device: 1
private:
net: 10.109.0.0/16:24
params:
@ -85,8 +85,8 @@ class TestDefaultTemplate(TestCase):
- 2
- -2
ip_reserved:
default_l2_network_device: 1
gateway: 1
l2_network_device: 1
vlan_end: 999
vlan_start: 900
public:
@ -100,8 +100,8 @@ class TestDefaultTemplate(TestCase):
- 128
- -2
ip_reserved:
default_l2_network_device: 1
gateway: 1
l2_network_device: 1
storage:
net: 10.109.0.0/16:24
params:
@ -110,8 +110,8 @@ class TestDefaultTemplate(TestCase):
- 2
- -2
ip_reserved:
default_l2_network_device: 1
gateway: 1
l2_network_device: 1
env_name: fuel_system_test
groups:
- driver:
@ -302,8 +302,8 @@ class TestDefaultTemplate(TestCase):
- 2
- -2
ip_reserved:
default_l2_network_device: 1
gateway: 1
l2_network_device: 1
management:
net: 10.109.0.0/16:24
params:
@ -312,8 +312,8 @@ class TestDefaultTemplate(TestCase):
- 2
- -2
ip_reserved:
default_l2_network_device: 1
gateway: 1
l2_network_device: 1
private:
net: 10.109.0.0/16:24
params:
@ -322,8 +322,8 @@ class TestDefaultTemplate(TestCase):
- 2
- -2
ip_reserved:
default_l2_network_device: 1
gateway: 1
l2_network_device: 1
vlan_end: 999
vlan_start: 900
public:
@ -337,8 +337,8 @@ class TestDefaultTemplate(TestCase):
- 128
- -2
ip_reserved:
default_l2_network_device: 1
gateway: 1
l2_network_device: 1
storage:
net: 10.109.0.0/16:24
params:
@ -347,8 +347,8 @@ class TestDefaultTemplate(TestCase):
- 2
- -2
ip_reserved:
default_l2_network_device: 1
gateway: 1
l2_network_device: 1
env_name: fuel_system_test
groups:
- driver:

View File

@ -31,7 +31,7 @@ example, change it for your purposes.
vlan_start: 1210
ip_reserved:
gateway: +1
l2_network_device: +1
default_l2_network_device: +1
ip_ranges:
dhcp: [+128, -32]
rack-01: [+2, +127]

View File

@ -119,7 +119,7 @@ Additional details about this template:
vlan_start: 0
ip_reserved:
gateway: +1
l2_network_device: +1 # l2_network_device will get this IP address
default_l2_network_device: +1 # l2_network_device will get this IP address
ip_ranges:
default: [+2, -2] # admin IP range for 'default' nodegroup name
@ -129,7 +129,7 @@ Additional details about this template:
vlan_start: 200
ip_reserved:
gateway: +1
l2_network_device: +1 # l2_network_device will get this IP address
default_l2_network_device: +1 # l2_network_device will get this IP address
ip_ranges:
default: [+2, +127] # public IP range for 'default' nodegroup name
floating: [+128, -2]

View File

@ -36,7 +36,7 @@ All slave nodes have only two network interfaces:
params:
ip_reserved:
gateway: +1
l2_network_device: +1 # l2_network_device will get this IP address
default_l2_network_device: +1 # l2_network_device will get this IP address
ip_ranges:
default: [+2, -2] # admin IP range for 'default' nodegroup name
@ -46,7 +46,7 @@ All slave nodes have only two network interfaces:
vlan_start: 100
ip_reserved:
gateway: +1
l2_network_device: +1 # l2_network_device will get this IP address
default_l2_network_device: +1 # l2_network_device will get this IP address
ip_ranges:
default: [+2, +127] # public IP range for 'default' nodegroup name
floating: [+128, -2]