From 136eecd2349ad3ea5d4f939dece4203ba3347030 Mon Sep 17 00:00:00 2001 From: Lucas Ratusznei Fonseca Date: Tue, 14 May 2024 15:07:31 -0300 Subject: [PATCH] Generate network interface config with single default gateway As it was before, sysinv placed a gateway address in every interface config file for which the corresponding address pool had a gateway specified. This allowed multiple default gateways to exist simultaneously in the system, causing network problems. This change improves the hieradata generation logic so that only one interface has default gateways, one for each address family. The chosen interface config follows a precedence order which depends on the network type: OAM > Management > Admin. Test plan System: AIO-SX subcloud IPv4 Initial setup: - oam0: ethernet, assigned to oam network, with gateway address - mgmt0: ethernet, assigned to mgmt network, no gateway address - admin0: ethernet, assigned to admin network, no gateway address [PASS] Add gateway to mgmt's address pool, check that oam's gateway remains the default [PASS] Add gateway to admin's address pool, check that oam's gateway remains the default [PASS] Remove gateway from oam's address pool, check that mgmt's gateway becomes the default [PASS] Remove gateway from mgmt's address pool, check that admin's gateway becomes the default Closes-Bug: 2065715 Change-Id: I28eb5de0c34db2cef089c83cf568ba61fa2d4e42 Signed-off-by: Lucas Ratusznei Fonseca --- .../sysinv/sysinv/sysinv/puppet/interface.py | 69 ++++++++++---- .../sysinv/tests/puppet/test_interface.py | 89 +++++++++---------- 2 files changed, 97 insertions(+), 61 deletions(-) diff --git a/sysinv/sysinv/sysinv/sysinv/puppet/interface.py b/sysinv/sysinv/sysinv/sysinv/puppet/interface.py index 2de9fa8ae5..7525309e88 100644 --- a/sysinv/sysinv/sysinv/sysinv/puppet/interface.py +++ b/sysinv/sysinv/sysinv/sysinv/puppet/interface.py @@ -151,6 +151,8 @@ class InterfacePuppet(base.BasePuppet): 'address_pools': address_pools, 'floatingips': self._get_floating_ip_index(networks, address_pools, network_address_pools), + 'gateways': self._get_default_gateway_index(host, addresses, address_pools, + network_address_pools), 'datanets': self._get_datanetworks(host), 'vswitchtype': self._vswitch_type(), } @@ -330,6 +332,55 @@ class InterfacePuppet(base.BasePuppet): return floating_ips + GATEWAY_PRECEDENCE_LIST = [constants.NETWORK_TYPE_OAM, + constants.NETWORK_TYPE_MGMT, + constants.NETWORK_TYPE_ADMIN] + + def _get_addrpool_gateway_field(self, host_personality, network_type): + if host_personality in [constants.STORAGE, constants.WORKER] and \ + network_type == constants.NETWORK_TYPE_MGMT: + return 'floating_address' + return 'gateway_address' + + def _get_default_gateway_index(self, host, addresses, address_pools, network_address_pools): + ''' + Gets a dictionary containing the default gateway addresses indexed by the corresponding + address pools. There can be only one default gateway per address family, so if there are + multiple address pools with gateways, the default one will follow the precedence order + OAM -> Management -> Admin. Only address pools which have an address assigned to an + interface in the current host are considered. + ''' + + assigned_addrpools = set() + for address_list in addresses.values(): + for address in address_list: + if address.forihostid == host.id and address.pool_uuid: + assigned_addrpools.add(address.pool_uuid) + + nw_addrpool_index = {} + for nw_addrpool in network_address_pools.values(): + if nw_addrpool.network_type not in self.GATEWAY_PRECEDENCE_LIST: + continue + if nw_addrpool.address_pool_uuid not in assigned_addrpools: + continue + addrpools = nw_addrpool_index.setdefault(nw_addrpool.network_type, []) + addrpools.append(address_pools[nw_addrpool.address_pool_uuid]) + + gateway_index = {} + for nw_type in self.GATEWAY_PRECEDENCE_LIST: + addrpools = nw_addrpool_index.get(nw_type, None) + if not addrpools: + continue + field = self._get_addrpool_gateway_field(host.personality, nw_type) + for addrpool in addrpools: + gateway = getattr(addrpool, field) + if gateway: + gateway_index[addrpool.uuid] = gateway + if gateway_index: + break + + return gateway_index + def _get_datanetworks(self, host): dnets = {} if constants.WORKER in utils.get_personalities(host): @@ -664,23 +715,11 @@ def _set_address_netmask(address): return address -def get_gateway_address(context, network, address): +def get_gateway_address(context, address): """ Gets the corresponding gateway for the provided address """ - - addrpool = context['address_pools'].get(address.pool_uuid, None) - - if not addrpool: - return None - - if (network and network.type == constants.NETWORK_TYPE_MGMT and - context['personality'] in [constants.WORKER, constants.STORAGE]): - gateway_address = addrpool.floating_address - else: - gateway_address = addrpool.gateway_address - - return gateway_address + return context['gateways'].get(address.pool_uuid, None) def get_interface_address_method(context, iface, network=None, address=None): @@ -1265,7 +1304,7 @@ def get_common_network_config(context, iface, config, network=None, address=None config['ipaddress'] = address['address'] config['netmask'] = address['netmask'] - gateway = get_gateway_address(context, network, address) + gateway = get_gateway_address(context, address) if gateway: config['options']['gateway'] = gateway return config diff --git a/sysinv/sysinv/sysinv/sysinv/tests/puppet/test_interface.py b/sysinv/sysinv/sysinv/sysinv/tests/puppet/test_interface.py index 501e78d815..8e23de1a57 100644 --- a/sysinv/sysinv/sysinv/sysinv/tests/puppet/test_interface.py +++ b/sysinv/sysinv/sysinv/sysinv/tests/puppet/test_interface.py @@ -668,7 +668,7 @@ class InterfaceTestCase2(InterfaceTestCaseMixin, dbbase.BaseHostTestCase): constants.NETWORK_TYPE_OAM) network, address = self._create_address_for_interface(self.iface) self._do_update_context() - gateway = interface.get_gateway_address(self.context, network, address) + gateway = interface.get_gateway_address(self.context, address) expected = str(self.oam_subnet[1]) self.assertEqual(gateway, expected) @@ -678,7 +678,7 @@ class InterfaceTestCase2(InterfaceTestCaseMixin, dbbase.BaseHostTestCase): constants.NETWORK_TYPE_MGMT) network, address = self._create_address_for_interface(self.iface) self._do_update_context() - gateway = interface.get_gateway_address(self.context, network, address) + gateway = interface.get_gateway_address(self.context, address) expected = str(self.mgmt_subnet[1]) self.assertEqual(gateway, expected) @@ -1375,8 +1375,7 @@ class InterfaceTestCase2(InterfaceTestCaseMixin, dbbase.BaseHostTestCase): ipv6_autocnf_off = self._get_ipv6_autoconf_off(self.port['name']) options = {'stx-description': 'ifname:mgmt0,net:cluster-host', 'post-up': '{}'.format(ipv6_autocnf_off), - 'mtu': '1500', - 'gateway': '192.168.206.1'} + 'mtu': '1500'} expected = self._get_static_network_config_ifupdown( ipaddress='192.168.206.10', ifname=f"{self.port['name']}:{network.id}-{address.id}", options=options) @@ -1835,8 +1834,7 @@ class InterfaceTestCase2(InterfaceTestCaseMixin, dbbase.BaseHostTestCase): ipv6_autocnf_off = self._get_ipv6_autoconf_off(self.port['name']) options = {'post-up': '%s' % ipv6_autocnf_off, 'mtu': '1500', - 'stx-description': 'ifname:mgmt0,net:cluster-host', - 'gateway': '192.168.206.1'} + 'stx-description': 'ifname:mgmt0,net:cluster-host'} expected = self._get_static_network_config_ifupdown( ipaddress='192.168.206.10', ifname=f"{self.port['name']}:{clhost_network.id}-{clhost_address.id}", options=options) @@ -1894,7 +1892,6 @@ class InterfaceTestCase2(InterfaceTestCaseMixin, dbbase.BaseHostTestCase): ipv6_autocnf_off = self._get_ipv6_autoconf_off(self.port['name']) options = {'stx-description': 'ifname:mgmt0,net:cluster-host', 'mtu': '1500', - 'gateway': '192.168.206.1', 'post-up': '{}'.format(ipv6_autocnf_off)} expected = self._get_static_network_config_ifupdown( ipaddress='192.168.206.10', @@ -4117,7 +4114,7 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): {NET: None, FAMILY: INET, METHOD: MANUAL, OPTIONS: {POST_UP: [SET_TC, IPV6_CFG]}}, {NET: constants.NETWORK_TYPE_PXEBOOT, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV4, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_MGMT, FAMILY: INET, METHOD: STATIC, OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, @@ -4129,16 +4126,16 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV4], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG, UNDEPR]}}, + OPTIONS: {POST_UP: [IPV6_CFG, UNDEPR]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG, UNDEPR]}}], + OPTIONS: {POST_UP: [IPV6_CFG, UNDEPR]}}], } self._validate_config(expected) @@ -4153,7 +4150,7 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): {NET: None, FAMILY: INET, METHOD: MANUAL, OPTIONS: {POST_UP: [SET_TC, IPV6_CFG]}}, {NET: constants.NETWORK_TYPE_PXEBOOT, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV4, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_MGMT, FAMILY: INET, METHOD: STATIC, OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, @@ -4162,10 +4159,10 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG, UNDEPR]}}, {MODES: [SS_IPV4, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV6, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}], + OPTIONS: {POST_UP: [IPV6_CFG]}}], } self._validate_config(expected) @@ -4181,7 +4178,7 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): {NET: None, FAMILY: INET, METHOD: MANUAL, OPTIONS: {POST_UP: [SET_TC, IPV6_CFG]}}, {NET: constants.NETWORK_TYPE_PXEBOOT, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV4, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_MGMT, FAMILY: INET, METHOD: STATIC, OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, @@ -4190,10 +4187,10 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG, UNDEPR]}}, {MODES: [SS_IPV4, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV6, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}], + OPTIONS: {POST_UP: [IPV6_CFG]}}], } self._validate_config(expected) @@ -4208,7 +4205,7 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): expected = { 'pxe0': [ {NET: constants.NETWORK_TYPE_PXEBOOT, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}], + OPTIONS: {POST_UP: [IPV6_CFG]}}], 'mgmt0': [ {NET: None, FAMILY: INET, METHOD: MANUAL, OPTIONS: {POST_UP: [SET_TC, IPV6_CFG]}}, @@ -4220,10 +4217,10 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG, UNDEPR]}}, {MODES: [SS_IPV4, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV6, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}], + OPTIONS: {POST_UP: [IPV6_CFG]}}], } self._validate_config(expected) @@ -4238,7 +4235,7 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): expected = { 'pxe0': [ {NET: constants.NETWORK_TYPE_PXEBOOT, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, 'bond-lacp-rate': 'fast', 'bond-miimon': '100', + OPTIONS: {'bond-lacp-rate': 'fast', 'bond-miimon': '100', 'bond-mode': '802.3ad', 'bond-slaves': True, 'bond-xmit-hash-policy': 'layer2', 'hwaddress': True, POST_UP: [SET_TC, IPV6_CFG], UP: [SLEEP]}}], @@ -4274,19 +4271,19 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): POST_UP: [SET_MTU, IPV6_CFG]}}, {MODES: [SS_IPV4], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, 'vlan-raw-device': True, PRE_UP: [VLAN_MOD], + OPTIONS: {'vlan-raw-device': True, PRE_UP: [VLAN_MOD], POST_UP: [SET_MTU, IPV6_CFG]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, 'vlan-raw-device': True, PRE_UP: [VLAN_MOD], + OPTIONS: {'vlan-raw-device': True, PRE_UP: [VLAN_MOD], POST_UP: [SET_MTU, IPV6_CFG]}}, {MODES: [SS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, 'vlan-raw-device': True, PRE_UP: [VLAN_MOD], + OPTIONS: {'vlan-raw-device': True, PRE_UP: [VLAN_MOD], POST_UP: [SET_MTU, IPV6_CFG, UNDEPR]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, 'vlan-raw-device': True, PRE_UP: [VLAN_MOD], + OPTIONS: {'vlan-raw-device': True, PRE_UP: [VLAN_MOD], POST_UP: [SET_MTU, IPV6_CFG, UNDEPR]}}], } self._validate_config(expected) @@ -4305,7 +4302,7 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): {NET: None, FAMILY: INET, METHOD: MANUAL, OPTIONS: {PRE_UP: [DIS_DAD], POST_UP: [SET_TC, IPV6_CFG]}}, {NET: constants.NETWORK_TYPE_PXEBOOT, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV4, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_MGMT, FAMILY: INET, METHOD: STATIC, OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, @@ -4317,16 +4314,16 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): OPTIONS: {PRE_UP: [DIS_DAD], POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV4], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [SET_TC, IPV6_CFG, UNDEPR]}}, + OPTIONS: {POST_UP: [SET_TC, IPV6_CFG, UNDEPR]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG, UNDEPR]}}], + OPTIONS: {POST_UP: [IPV6_CFG, UNDEPR]}}], } self._validate_config(expected) @@ -4344,7 +4341,7 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): expected = { 'pxe0': [ {NET: constants.NETWORK_TYPE_PXEBOOT, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}], + OPTIONS: {POST_UP: [IPV6_CFG]}}], 'mgmt0': [ {NET: None, FAMILY: INET, METHOD: MANUAL, OPTIONS: {'bond-lacp-rate': 'fast', 'bond-miimon': '100', @@ -4392,21 +4389,21 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): POST_DOWN: [VLAN_DEL]}}, {MODES: [SS_IPV4], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, 'vlan-raw-device': True, + OPTIONS: {'vlan-raw-device': True, PRE_UP: [VLAN_MOD], POST_UP: [SET_MTU, IPV6_CFG]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, 'vlan-raw-device': True, + OPTIONS: {'vlan-raw-device': True, PRE_UP: [VLAN_MOD], POST_UP: [SET_MTU, IPV6_CFG]}}, {MODES: [SS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, 'vlan-raw-device': True, + OPTIONS: {'vlan-raw-device': True, PRE_UP: [VLAN_MOD], POST_UP: [SET_MTU, IPV6_CFG, UNDEPR]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, 'vlan-raw-device': True, + OPTIONS: {'vlan-raw-device': True, PRE_UP: [VLAN_MOD], POST_UP: [SET_MTU, IPV6_CFG, UNDEPR]}}], } self._validate_config(expected) @@ -4435,16 +4432,16 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): OPTIONS: {POST_UP: [SET_TC, IPV6_CFG]}}, {MODES: [SS_IPV4], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [SET_TC, IPV6_CFG, UNDEPR]}}, + OPTIONS: {POST_UP: [SET_TC, IPV6_CFG, UNDEPR]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG, UNDEPR]}}], + OPTIONS: {POST_UP: [IPV6_CFG, UNDEPR]}}], } self._validate_config(expected) @@ -4472,16 +4469,16 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV4], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG, UNDEPR]}}, + OPTIONS: {POST_UP: [IPV6_CFG, UNDEPR]}}, {MODES: [DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG, UNDEPR]}}], + OPTIONS: {POST_UP: [IPV6_CFG, UNDEPR]}}], } self._validate_config(expected) @@ -4514,10 +4511,10 @@ class InterfaceConfigTestMixin(InterfaceTestCaseMixin): OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV4, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG]}}, + OPTIONS: {POST_UP: [IPV6_CFG]}}, {MODES: [SS_IPV6, DS_IPV4, DS_IPV6], NET: constants.NETWORK_TYPE_CLUSTER_HOST, FAMILY: INET6, METHOD: STATIC, - OPTIONS: {GATEWAY: True, POST_UP: [IPV6_CFG, UNDEPR]}}], + OPTIONS: {POST_UP: [IPV6_CFG, UNDEPR]}}], } self._validate_config(expected)