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 <lucas.ratuszneifonseca@windriver.com>
This commit is contained in:
Lucas Ratusznei Fonseca 2024-05-14 15:07:31 -03:00
parent 8b8b761be1
commit 136eecd234
2 changed files with 97 additions and 61 deletions

View File

@ -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

View File

@ -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)