mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Feat: nmcli - Add infiniband and routes support (#1260)
* Feat: nmcli - Add infiniband basic support Add infiniband basic support, using same pattern than ethernet. * Fix: nmcli - Correct line length Auto tests report line 1002 is too long. Correcting. * Update plugins/modules/net_tools/nmcli.py Co-authored-by: Felix Fontein <felix@fontein.de> * Fix: nmcli - Add routes support Adding ipv4.routes support Adding ipv4.never-default support * Fix: nmcli - Add 1260 changelog fragment * Update plugins/modules/net_tools/nmcli.py Co-authored-by: Felix Fontein <felix@fontein.de> * Update changelogs/fragments/1260-nmcli-ib-routes.yaml Co-authored-by: Felix Fontein <felix@fontein.de> * Fix: nmcli - Fix routes4 and never-default Ensure ipv4.routes and ipv4.nerver-default are properly implemented. * Fix: nmcli - Fix routes4 documentation Bad format, was str, should be list with elements str * Fix: nmcli - Add missing version_added * Fix: nmcli - Fix pylint errors * Feat: nmcli - Use regex for ipv4.routes * Fix: nmcli - Filter None routes4 * Feat: nmcli - Add route_metric4 and set mutual_exclu * Fix: nmcli - Fix E231 * Fox: nmcli - Remove ethernet MTU change for Infiniband * Fix: nmcli - Update changelog fragment * Fix: nmcli - Update test ipv6 * Debug: nmcli - Check test output * Fix: nmcli - Set never_default4 to no by default * Fix: nmcli - Fix bridge slave test * Fix: nmcli - Add regex for metrics * Fix: nmcli - Update release version * Fix: nmcli - E501 * Fix: nmcli - E502 E128 * Update plugins/modules/net_tools/nmcli.py Co-authored-by: Felix Fontein <felix@fontein.de> * Update plugins/modules/net_tools/nmcli.py Co-authored-by: Felix Fontein <felix@fontein.de> * Update plugins/modules/net_tools/nmcli.py Co-authored-by: Felix Fontein <felix@fontein.de> * Update plugins/modules/net_tools/nmcli.py Co-authored-by: Felix Fontein <felix@fontein.de> Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
parent
db61a899d5
commit
b8794c35e8
3 changed files with 75 additions and 4 deletions
4
changelogs/fragments/1260-nmcli-ib-routes.yaml
Normal file
4
changelogs/fragments/1260-nmcli-ib-routes.yaml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
minor_changes:
|
||||||
|
- nmcli - add infiniband type support (https://github.com/ansible-collections/community.general/pull/1260).
|
||||||
|
- nmcli - add ``ipv4.routes``, ``ipv4.route-metric`` and ``ipv4.never-default`` support (https://github.com/ansible-collections/community.general/pull/1260).
|
|
@ -52,8 +52,9 @@ options:
|
||||||
description:
|
description:
|
||||||
- This is the type of device or network connection that you wish to create or modify.
|
- This is the type of device or network connection that you wish to create or modify.
|
||||||
- Type C(generic) is added in Ansible 2.5.
|
- Type C(generic) is added in Ansible 2.5.
|
||||||
|
- Type C(infiniband) is added in community.general 2.0.0.
|
||||||
type: str
|
type: str
|
||||||
choices: [ bond, bond-slave, bridge, bridge-slave, ethernet, generic, ipip, sit, team, team-slave, vlan, vxlan ]
|
choices: [ bond, bond-slave, bridge, bridge-slave, ethernet, generic, infiniband, ipip, sit, team, team-slave, vlan, vxlan ]
|
||||||
mode:
|
mode:
|
||||||
description:
|
description:
|
||||||
- This is the type of device or network connection that you wish to create for a bond, team or bridge.
|
- This is the type of device or network connection that you wish to create for a bond, team or bridge.
|
||||||
|
@ -73,7 +74,27 @@ options:
|
||||||
description:
|
description:
|
||||||
- The IPv4 gateway for this interface.
|
- The IPv4 gateway for this interface.
|
||||||
- Use the format C(192.0.2.1).
|
- Use the format C(192.0.2.1).
|
||||||
|
- This parameter is mutually_exclusive with never_default4 parameter.
|
||||||
type: str
|
type: str
|
||||||
|
routes4:
|
||||||
|
description:
|
||||||
|
- The list of ipv4 routes.
|
||||||
|
- Use the format '192.0.3.0/24 192.0.2.1'
|
||||||
|
type: list
|
||||||
|
elements: str
|
||||||
|
version_added: 2.0.0
|
||||||
|
route_metric4:
|
||||||
|
description:
|
||||||
|
- Set metric level of ipv4 routes configured on interface.
|
||||||
|
type: int
|
||||||
|
version_added: 2.0.0
|
||||||
|
never_default4:
|
||||||
|
description:
|
||||||
|
- Set as default route.
|
||||||
|
- This parameter is mutually_exclusive with gw4 parameter.
|
||||||
|
type: bool
|
||||||
|
default: no
|
||||||
|
version_added: 2.0.0
|
||||||
dns4:
|
dns4:
|
||||||
description:
|
description:
|
||||||
- A list of up to 3 dns servers.
|
- A list of up to 3 dns servers.
|
||||||
|
@ -572,6 +593,9 @@ class Nmcli(object):
|
||||||
self.type = module.params['type']
|
self.type = module.params['type']
|
||||||
self.ip4 = module.params['ip4']
|
self.ip4 = module.params['ip4']
|
||||||
self.gw4 = module.params['gw4']
|
self.gw4 = module.params['gw4']
|
||||||
|
self.routes4 = module.params['routes4']
|
||||||
|
self.route_metric4 = module.params['route_metric4']
|
||||||
|
self.never_default4 = module.params['never_default4']
|
||||||
self.dns4 = module.params['dns4']
|
self.dns4 = module.params['dns4']
|
||||||
self.dns4_search = module.params['dns4_search']
|
self.dns4_search = module.params['dns4_search']
|
||||||
self.ip6 = module.params['ip6']
|
self.ip6 = module.params['ip6']
|
||||||
|
@ -645,6 +669,9 @@ class Nmcli(object):
|
||||||
'ipv4.dns': self.dns4,
|
'ipv4.dns': self.dns4,
|
||||||
'ipv4.dns-search': self.dns4_search,
|
'ipv4.dns-search': self.dns4_search,
|
||||||
'ipv4.gateway': self.gw4,
|
'ipv4.gateway': self.gw4,
|
||||||
|
'ipv4.routes': self.routes4,
|
||||||
|
'ipv4.route-metric': self.route_metric4,
|
||||||
|
'ipv4.never-default': self.never_default4,
|
||||||
'ipv4.method': self.ipv4_method,
|
'ipv4.method': self.ipv4_method,
|
||||||
'ipv6.addresses': self.ip6,
|
'ipv6.addresses': self.ip6,
|
||||||
'ipv6.dns': self.dns6,
|
'ipv6.dns': self.dns6,
|
||||||
|
@ -742,6 +769,7 @@ class Nmcli(object):
|
||||||
'bridge-slave',
|
'bridge-slave',
|
||||||
'ethernet',
|
'ethernet',
|
||||||
'generic',
|
'generic',
|
||||||
|
'infiniband',
|
||||||
'team',
|
'team',
|
||||||
'vlan',
|
'vlan',
|
||||||
)
|
)
|
||||||
|
@ -805,10 +833,13 @@ class Nmcli(object):
|
||||||
def settings_type(setting):
|
def settings_type(setting):
|
||||||
if setting in ('bridge.stp',
|
if setting in ('bridge.stp',
|
||||||
'bridge-port.hairpin-mode',
|
'bridge-port.hairpin-mode',
|
||||||
'connection.autoconnect'):
|
'connection.autoconnect',
|
||||||
|
'ipv4.never-default'):
|
||||||
return bool
|
return bool
|
||||||
elif setting in ('ipv4.dns',
|
elif setting in ('ipv4.dns',
|
||||||
'ipv4.dns-search',
|
'ipv4.dns-search',
|
||||||
|
'ipv4.routes',
|
||||||
|
'ipv4.route-metric'
|
||||||
'ipv6.dns',
|
'ipv6.dns',
|
||||||
'ipv6.dns-search'):
|
'ipv6.dns-search'):
|
||||||
return list
|
return list
|
||||||
|
@ -873,7 +904,7 @@ class Nmcli(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def create_connection_up(self):
|
def create_connection_up(self):
|
||||||
if self.type in ('bond', 'ethernet'):
|
if self.type in ('bond', 'ethernet', 'infiniband'):
|
||||||
if (self.mtu is not None) or (self.dns4 is not None) or (self.dns6 is not None):
|
if (self.mtu is not None) or (self.dns4 is not None) or (self.dns6 is not None):
|
||||||
return True
|
return True
|
||||||
elif self.type == 'team':
|
elif self.type == 'team':
|
||||||
|
@ -917,6 +948,8 @@ class Nmcli(object):
|
||||||
alias_key = alias_pair[0]
|
alias_key = alias_pair[0]
|
||||||
alias_value = alias_pair[1]
|
alias_value = alias_pair[1]
|
||||||
conn_info[alias_key] = alias_value
|
conn_info[alias_key] = alias_value
|
||||||
|
elif key == 'ipv4.routes':
|
||||||
|
conn_info[key] = [s.strip() for s in raw_value.split(';')]
|
||||||
elif key_type == list:
|
elif key_type == list:
|
||||||
conn_info[key] = [s.strip() for s in raw_value.split(',')]
|
conn_info[key] = [s.strip() for s in raw_value.split(',')]
|
||||||
else:
|
else:
|
||||||
|
@ -951,6 +984,14 @@ class Nmcli(object):
|
||||||
|
|
||||||
if key in conn_info:
|
if key in conn_info:
|
||||||
current_value = conn_info[key]
|
current_value = conn_info[key]
|
||||||
|
if key == 'ipv4.routes' and current_value is not None:
|
||||||
|
# ipv4.routes do not have same options and show_connection() format
|
||||||
|
# options: ['10.11.0.0/24 10.10.0.2', '10.12.0.0/24 10.10.0.2 200']
|
||||||
|
# show_connection(): ['{ ip = 10.11.0.0/24, nh = 10.10.0.2 }', '{ ip = 10.12.0.0/24, nh = 10.10.0.2, mt = 200 }']
|
||||||
|
# Need to convert in order to compare both
|
||||||
|
current_value = [re.sub(r'^{\s*ip\s*=\s*([^, ]+),\s*nh\s*=\s*([^} ]+),\s*mt\s*=\s*([^} ]+)\s*}', r'\1 \2 \3',
|
||||||
|
route) for route in current_value]
|
||||||
|
current_value = [re.sub(r'^{\s*ip\s*=\s*([^, ]+),\s*nh\s*=\s*([^} ]+)\s*}', r'\1 \2', route) for route in current_value]
|
||||||
elif key in param_alias:
|
elif key in param_alias:
|
||||||
real_key = param_alias[key]
|
real_key = param_alias[key]
|
||||||
if real_key in conn_info:
|
if real_key in conn_info:
|
||||||
|
@ -997,9 +1038,26 @@ def main():
|
||||||
master=dict(type='str'),
|
master=dict(type='str'),
|
||||||
ifname=dict(type='str'),
|
ifname=dict(type='str'),
|
||||||
type=dict(type='str',
|
type=dict(type='str',
|
||||||
choices=['bond', 'bond-slave', 'bridge', 'bridge-slave', 'ethernet', 'generic', 'ipip', 'sit', 'team', 'team-slave', 'vlan', 'vxlan']),
|
choices=[
|
||||||
|
'bond',
|
||||||
|
'bond-slave',
|
||||||
|
'bridge',
|
||||||
|
'bridge-slave',
|
||||||
|
'ethernet',
|
||||||
|
'generic',
|
||||||
|
'infiniband',
|
||||||
|
'ipip',
|
||||||
|
'sit',
|
||||||
|
'team',
|
||||||
|
'team-slave',
|
||||||
|
'vlan',
|
||||||
|
'vxlan'
|
||||||
|
]),
|
||||||
ip4=dict(type='str'),
|
ip4=dict(type='str'),
|
||||||
gw4=dict(type='str'),
|
gw4=dict(type='str'),
|
||||||
|
routes4=dict(type='list', elements='str'),
|
||||||
|
route_metric4=dict(type='int'),
|
||||||
|
never_default4=dict(type='bool', default=False),
|
||||||
dns4=dict(type='list', elements='str'),
|
dns4=dict(type='list', elements='str'),
|
||||||
dns4_search=dict(type='list', elements='str'),
|
dns4_search=dict(type='list', elements='str'),
|
||||||
dhcp_client_id=dict(type='str'),
|
dhcp_client_id=dict(type='str'),
|
||||||
|
@ -1044,6 +1102,7 @@ def main():
|
||||||
ip_tunnel_local=dict(type='str'),
|
ip_tunnel_local=dict(type='str'),
|
||||||
ip_tunnel_remote=dict(type='str'),
|
ip_tunnel_remote=dict(type='str'),
|
||||||
),
|
),
|
||||||
|
mutually_exclusive=[['never_default4', 'gw4']],
|
||||||
supports_check_mode=True,
|
supports_check_mode=True,
|
||||||
)
|
)
|
||||||
module.run_command_environ_update = dict(LANG='C', LC_ALL='C', LC_MESSAGES='C', LC_CTYPE='C')
|
module.run_command_environ_update = dict(LANG='C', LC_ALL='C', LC_MESSAGES='C', LC_CTYPE='C')
|
||||||
|
|
|
@ -95,6 +95,7 @@ connection.autoconnect: yes
|
||||||
ipv4.method: manual
|
ipv4.method: manual
|
||||||
ipv4.addresses: 10.10.10.10/24
|
ipv4.addresses: 10.10.10.10/24
|
||||||
ipv4.gateway: 10.10.10.1
|
ipv4.gateway: 10.10.10.1
|
||||||
|
ipv4.never-default: no
|
||||||
ipv6.method: auto
|
ipv6.method: auto
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -119,6 +120,7 @@ connection.autoconnect: yes
|
||||||
ipv4.method: manual
|
ipv4.method: manual
|
||||||
ipv4.addresses: 10.10.10.10/24
|
ipv4.addresses: 10.10.10.10/24
|
||||||
ipv4.gateway: 10.10.10.1
|
ipv4.gateway: 10.10.10.1
|
||||||
|
ipv4.never-default: no
|
||||||
ipv4.dns-search: search.redhat.com
|
ipv4.dns-search: search.redhat.com
|
||||||
ipv6.dns-search: search6.redhat.com
|
ipv6.dns-search: search6.redhat.com
|
||||||
ipv6.method: auto
|
ipv6.method: auto
|
||||||
|
@ -145,6 +147,7 @@ connection.autoconnect: yes
|
||||||
ipv4.method: manual
|
ipv4.method: manual
|
||||||
ipv4.addresses: 10.10.10.10/24
|
ipv4.addresses: 10.10.10.10/24
|
||||||
ipv4.gateway: 10.10.10.1
|
ipv4.gateway: 10.10.10.1
|
||||||
|
ipv4.never-default: no
|
||||||
ipv6.method: auto
|
ipv6.method: auto
|
||||||
bond.options: mode=active-backup,primary=non_existent_primary
|
bond.options: mode=active-backup,primary=non_existent_primary
|
||||||
"""
|
"""
|
||||||
|
@ -170,6 +173,7 @@ connection.autoconnect: yes
|
||||||
ipv4.method: manual
|
ipv4.method: manual
|
||||||
ipv4.addresses: 10.10.10.10/24
|
ipv4.addresses: 10.10.10.10/24
|
||||||
ipv4.gateway: 10.10.10.1
|
ipv4.gateway: 10.10.10.1
|
||||||
|
ipv4.never-default: no
|
||||||
ipv6.method: auto
|
ipv6.method: auto
|
||||||
bridge.stp: yes
|
bridge.stp: yes
|
||||||
bridge.max-age: 100
|
bridge.max-age: 100
|
||||||
|
@ -194,6 +198,7 @@ TESTCASE_BRIDGE_SLAVE_SHOW_OUTPUT = """\
|
||||||
connection.id: non_existent_nw_device
|
connection.id: non_existent_nw_device
|
||||||
connection.interface-name: br0_non_existant
|
connection.interface-name: br0_non_existant
|
||||||
connection.autoconnect: yes
|
connection.autoconnect: yes
|
||||||
|
ipv4.never-default: no
|
||||||
bridge-port.path-cost: 100
|
bridge-port.path-cost: 100
|
||||||
bridge-port.hairpin-mode: yes
|
bridge-port.hairpin-mode: yes
|
||||||
bridge-port.priority: 32
|
bridge-port.priority: 32
|
||||||
|
@ -219,6 +224,7 @@ connection.autoconnect: yes
|
||||||
ipv4.method: manual
|
ipv4.method: manual
|
||||||
ipv4.addresses: 10.10.10.10/24
|
ipv4.addresses: 10.10.10.10/24
|
||||||
ipv4.gateway: 10.10.10.1
|
ipv4.gateway: 10.10.10.1
|
||||||
|
ipv4.never-default: no
|
||||||
ipv6.method: auto
|
ipv6.method: auto
|
||||||
vlan.id: 10
|
vlan.id: 10
|
||||||
"""
|
"""
|
||||||
|
@ -309,6 +315,7 @@ connection.autoconnect: yes
|
||||||
802-3-ethernet.mtu: auto
|
802-3-ethernet.mtu: auto
|
||||||
ipv4.method: auto
|
ipv4.method: auto
|
||||||
ipv4.dhcp-client-id: 00:11:22:AA:BB:CC:DD
|
ipv4.dhcp-client-id: 00:11:22:AA:BB:CC:DD
|
||||||
|
ipv4.never-default: no
|
||||||
ipv6.method: auto
|
ipv6.method: auto
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -333,6 +340,7 @@ connection.autoconnect: yes
|
||||||
ipv4.method: manual
|
ipv4.method: manual
|
||||||
ipv4.addresses: 10.10.10.10/24
|
ipv4.addresses: 10.10.10.10/24
|
||||||
ipv4.gateway: 10.10.10.1
|
ipv4.gateway: 10.10.10.1
|
||||||
|
ipv4.never-default: no
|
||||||
ipv4.dns: 1.1.1.1,8.8.8.8
|
ipv4.dns: 1.1.1.1,8.8.8.8
|
||||||
ipv6.method: auto
|
ipv6.method: auto
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in a new issue