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 dhcp_range_end = None
addresses = [] addresses = []
if self.address_pool is not None: if self.address_pool is not None:
# Reserved names 'l2_network_device' and 'dhcp' # Reserved name '<group.name>_l2_network_device'
ip_network_address = self.address_pool.get_ip('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' # Backward compatibility with existing templates
# address was not reserved in the YAML template # where only one l2_network_device per address pool is used
if not ip_network_address: 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) 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_start = self.address_pool.ip_range_start('dhcp')
dhcp_range_end = self.address_pool.ip_range_end('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: for address in interface.addresses:
ip_addr = netaddr.IPAddress(address.ip_address) ip_addr = netaddr.IPAddress(address.ip_address)
if ip_addr in self.address_pool.ip_network: 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 will be used for configure OpenStack networks
'gateway': 1, 'gateway': 1,
# l2_network_device will be used for configure local bridge # l2_network_device will be used for configure local bridge
'l2_network_device': 1, 'default_l2_network_device': 1,
}, },
'ip_ranges': { 'ip_ranges': {
'default': [2, -2], 'default': [2, -2],

View File

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

View File

@ -321,7 +321,10 @@ class Shell(object):
node.name, node.name,
node.get_ip_address_by_network_name(l2dev.name))) node.get_ip_address_by_network_name(l2dev.name)))
if ap_slave_ips: 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: if not slave_ips:
sys.exit('No IPs were allocated for environment!') sys.exit('No IPs were allocated for environment!')

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -119,7 +119,7 @@ Additional details about this template:
vlan_start: 0 vlan_start: 0
ip_reserved: ip_reserved:
gateway: +1 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: ip_ranges:
default: [+2, -2] # admin IP range for 'default' nodegroup name default: [+2, -2] # admin IP range for 'default' nodegroup name
@ -129,7 +129,7 @@ Additional details about this template:
vlan_start: 200 vlan_start: 200
ip_reserved: ip_reserved:
gateway: +1 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: ip_ranges:
default: [+2, +127] # public IP range for 'default' nodegroup name default: [+2, +127] # public IP range for 'default' nodegroup name
floating: [+128, -2] floating: [+128, -2]

View File

@ -36,7 +36,7 @@ All slave nodes have only two network interfaces:
params: params:
ip_reserved: ip_reserved:
gateway: +1 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: ip_ranges:
default: [+2, -2] # admin IP range for 'default' nodegroup name 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 vlan_start: 100
ip_reserved: ip_reserved:
gateway: +1 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: ip_ranges:
default: [+2, +127] # public IP range for 'default' nodegroup name default: [+2, +127] # public IP range for 'default' nodegroup name
floating: [+128, -2] floating: [+128, -2]