From 4b2873a312785c9b22e1850aec7387aa8b6e6058 Mon Sep 17 00:00:00 2001 From: Bart Wensley Date: Thu, 15 Mar 2018 07:27:41 -0500 Subject: [PATCH] Allow large IP address ranges Fix inefficient IP address validation code in config_controller so large IP address ranges can be used. Also fix INI file validation to prevent the configuration of an IPv6 management network without a separate PXEBOOT network. Change-Id: I87e1801092a35d74354b666e8ecd76cbf4d1e14c Signed-off-by: Bart Wensley --- configutilities/centos/build_srpm.data | 2 +- .../configutilities/common/configobjects.py | 7 +++---- .../configutilities/common/validator.py | 5 +++++ controllerconfig/centos/build_srpm.data | 2 +- .../controllerconfig/configassistant.py | 16 +++++++------- .../tests/files/system_config.ipv6 | 6 +++--- .../tests/test_system_config.py | 21 +++++++++++++++++++ 7 files changed, 41 insertions(+), 18 deletions(-) diff --git a/configutilities/centos/build_srpm.data b/configutilities/centos/build_srpm.data index c4c576d0ed..be5aa85bae 100755 --- a/configutilities/centos/build_srpm.data +++ b/configutilities/centos/build_srpm.data @@ -1,3 +1,3 @@ SRC_DIR="configutilities" COPY_LIST="$SRC_DIR/LICENSE" -TIS_PATCH_VER=34 +TIS_PATCH_VER=35 diff --git a/configutilities/configutilities/configutilities/common/configobjects.py b/configutilities/configutilities/configutilities/common/configobjects.py index 02d8072e61..0316dc6bdf 100755 --- a/configutilities/configutilities/configutilities/common/configobjects.py +++ b/configutilities/configutilities/configutilities/common/configobjects.py @@ -5,7 +5,7 @@ SPDX-License-Identifier: Apache-2.0 """ -from netaddr import iter_iprange +from netaddr import IPRange from exceptions import ConfigFail, ValidateFail from utils import is_mtu_valid, is_speed_valid, is_valid_vlan, \ validate_network_str, validate_address_str @@ -307,9 +307,8 @@ class Network(object): "Start address %s not less than end address %s for %s." % (str(self.start_address), str(self.end_address), network_name)) - address_list = list(iter_iprange(start_address_str, - end_address_str)) - if not len(address_list) >= min_addresses: + if not IPRange(start_address_str, end_address_str).size >= \ + min_addresses: raise ConfigFail("Address range for %s must contain at " "least %d addresses." % (network_name, min_addresses)) diff --git a/configutilities/configutilities/configutilities/common/validator.py b/configutilities/configutilities/configutilities/common/validator.py index 1ad174359b..bda6bea42e 100755 --- a/configutilities/configutilities/configutilities/common/validator.py +++ b/configutilities/configutilities/configutilities/common/validator.py @@ -406,6 +406,11 @@ class ConfigValidator(object): "Management VLAN must be configured because " "%s configured." % self.pxeboot_section_name) + if not self.is_simplex_cpe() and self.mgmt_network.cidr.version == 6 \ + and not self.pxeboot_network_configured: + raise ConfigFail("IPv6 management network cannot be configured " + "because PXEBOOT_NETWORK is not configured.") + mtu = self.mgmt_network.logical_interface.mtu if not is_mtu_valid(mtu): raise ConfigFail( diff --git a/controllerconfig/centos/build_srpm.data b/controllerconfig/centos/build_srpm.data index ecced5eecc..077f10f717 100755 --- a/controllerconfig/centos/build_srpm.data +++ b/controllerconfig/centos/build_srpm.data @@ -1,2 +1,2 @@ SRC_DIR="controllerconfig" -TIS_PATCH_VER=140 +TIS_PATCH_VER=141 diff --git a/controllerconfig/controllerconfig/controllerconfig/configassistant.py b/controllerconfig/controllerconfig/controllerconfig/configassistant.py index 839581bbbb..c4d149db97 100644 --- a/controllerconfig/controllerconfig/controllerconfig/configassistant.py +++ b/controllerconfig/controllerconfig/controllerconfig/configassistant.py @@ -27,7 +27,7 @@ from configutilities import is_valid_vlan, is_mtu_valid, is_speed_valid, \ from configutilities import DEFAULT_DOMAIN_NAME from netaddr import (IPNetwork, IPAddress, - iter_iprange, + IPRange, AddrFormatError) from sysinv.common import constants as sysinv_constants from tsconfig.tsconfig import SW_VERSION @@ -1193,10 +1193,9 @@ class ConfigAssistant(): print continue - address_list = list(iter_iprange( - str(self.management_start_address), - str(self.management_end_address))) - if not len(address_list) >= min_addresses: + address_range = IPRange(str(self.management_start_address), + str(self.management_end_address)) + if not address_range.size >= min_addresses: print ( "Address range must contain at least %d addresses. " % min_addresses) @@ -1742,10 +1741,9 @@ class ConfigAssistant(): print continue - address_list = list(iter_iprange( - str(self.infrastructure_start_address), - str(self.infrastructure_end_address))) - if not len(address_list) >= min_addresses: + address_range = IPRange(str(self.infrastructure_start_address), + str(self.infrastructure_end_address)) + if not address_range.size >= min_addresses: print ( "Address range must contain at least %d addresses. " % min_addresses) diff --git a/controllerconfig/controllerconfig/controllerconfig/tests/files/system_config.ipv6 b/controllerconfig/controllerconfig/controllerconfig/tests/files/system_config.ipv6 index eb276ad1f1..6cf988132e 100755 --- a/controllerconfig/controllerconfig/controllerconfig/tests/files/system_config.ipv6 +++ b/controllerconfig/controllerconfig/controllerconfig/tests/files/system_config.ipv6 @@ -23,7 +23,7 @@ INTERFACE_MTU=1500 INTERFACE_PORTS=eth0 [MGMT_NETWORK] -;VLAN=123 +VLAN=123 CIDR=1234::/64 MULTICAST_CIDR=ff08::1:1:0/124 DYNAMIC_ALLOCATION=Y @@ -49,8 +49,8 @@ CIDR=abcd::/64 GATEWAY=abcd::1 LOGICAL_INTERFACE=LOGICAL_INTERFACE_2 -;[PXEBOOT_NETWORK] -;PXEBOOT_CIDR=192.168.203.0/24 +[PXEBOOT_NETWORK] +PXEBOOT_CIDR=192.168.203.0/24 ;[BOARD_MANAGEMENT_NETWORK] ;VLAN=1 diff --git a/controllerconfig/controllerconfig/controllerconfig/tests/test_system_config.py b/controllerconfig/controllerconfig/controllerconfig/tests/test_system_config.py index ae1e530f83..c23cd86727 100644 --- a/controllerconfig/controllerconfig/controllerconfig/tests/test_system_config.py +++ b/controllerconfig/controllerconfig/controllerconfig/tests/test_system_config.py @@ -136,6 +136,27 @@ def test_system_config_validation(): with pytest.raises(exceptions.ConfigFail): validate(system_config, DEFAULT_CONFIG, None, False) + # Test missing pxeboot network when using IPv6 management network + system_config = cr.parse_system_config(ipv6_systemfile) + system_config.remove_section('PXEBOOT_NETWORK') + with pytest.raises(exceptions.ConfigFail): + cr.create_cgcs_config_file(None, system_config, None, None, None, 0, + validate_only=True) + with pytest.raises(exceptions.ConfigFail): + validate(system_config, DEFAULT_CONFIG, None, False) + + # Test ridiculously sized management network + system_config = cr.parse_system_config(ipv6_systemfile) + system_config.set('MGMT_NETWORK', 'IP_START_ADDRESS', '1234::b:0:0:0') + system_config.set('MGMT_NETWORK', 'IP_END_ADDRESS', + '1234::b:ffff:ffff:ffff') + system_config.remove_option('MGMT_NETWORK', 'IP_FLOATING_ADDRESS') + system_config.remove_option('MGMT_NETWORK', 'IP_UNIT_0_ADDRESS') + system_config.remove_option('MGMT_NETWORK', 'IP_UNIT_1_ADDRESS') + cr.create_cgcs_config_file(None, system_config, None, None, None, 0, + validate_only=True) + validate(system_config, DEFAULT_CONFIG, None, False) + # Test using start/end addresses system_config = cr.parse_system_config(ipv6_systemfile) system_config.set('OAM_NETWORK', 'IP_START_ADDRESS', 'abcd::2')