Skip to content

Commit d3ecc50

Browse files
committed
[dhcp_static] Allow use of display name for netif; Error in case a interface group name is specified; Fixes #79
1 parent dada6d7 commit d3ecc50

25 files changed

+69
-35
lines changed

plugins/modules/pfsense_dhcp_static.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,11 @@
144144
"""
145145

146146
RETURN = """
147-
147+
netif:
148+
description: The selected interface
149+
returned: success
150+
type: str
151+
sample: 'lan'
148152
"""
149153

150154
from ipaddress import ip_address, ip_network
@@ -223,10 +227,15 @@ def _validate_params(self):
223227
self.module.fail_json(msg='A valid MAC address must be specified.')
224228

225229
if params['netif'] is not None:
226-
self.pfsense.parse_interface(params['netif'])
230+
if self.pfsense.is_interface_group(params['netif']):
231+
self.module.fail_json(msg='DHCP cannot be configured for interface groups')
232+
else:
233+
netif = self.pfsense.parse_interface(params['netif'])
234+
else:
235+
netif = None
227236

228237
# find staticmaps and determine interface
229-
self._find_staticmaps(params['netif'])
238+
self._find_staticmaps(netif)
230239

231240
if params['ipaddr'] is not None:
232241
addr = ip_address(u'{0}'.format(params['ipaddr']))
@@ -297,6 +306,8 @@ def _find_staticmaps(self, netif=None):
297306
else:
298307
self.module.fail_json(msg="No DHCP configuration found for netif='{0}'".format(netif))
299308

309+
self.result['netif'] = netif
310+
300311
def _find_target(self):
301312
if self.params['name'] is not None and self.params['macaddr'] is not None:
302313
result = self.root_elt.findall("staticmap[cid='{0}'][mac='{1}']".format(self.params['name'], self.params['macaddr']))

tests/unit/plugins/modules/fixtures/pfsense_dhcp_static_config.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1741,6 +1741,13 @@
17411741
<domain>acme.com</domain>
17421742
</system>
17431743
</wizardtemp>
1744+
<ifgroups>
1745+
<ifgroupentry>
1746+
<members>opt1 opt2 opt3</members>
1747+
<descr></descr>
1748+
<ifname>IFGROUP1</ifname>
1749+
</ifgroupentry>
1750+
</ifgroups>
17441751
<vlans>
17451752
<vlan>
17461753
<if>vmx0</if>

tests/unit/plugins/modules/pfsense_module.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def get_args_fields(self):
110110
except AttributeError:
111111
raise NotImplementedError()
112112

113-
def get_target_elt(self, obj, absent=False):
113+
def get_target_elt(self, obj, absent=False, module_result=None):
114114
""" return target elt from XML """
115115
raise NotImplementedError()
116116

@@ -180,12 +180,12 @@ def do_module_test(self, obj, command=None, changed=True, failed=False, msg=None
180180
self.assertEqual(result['commands'], [])
181181
elif delete:
182182
self.assertTrue(self.load_xml_result())
183-
target_elt = self.get_target_elt(obj, absent=True)
183+
target_elt = self.get_target_elt(obj, absent=True, module_result=result)
184184
self.assertIsNone(target_elt)
185185
self.assertEqual(result['commands'], command)
186186
else:
187187
self.assertTrue(self.load_xml_result())
188-
target_elt = self.get_target_elt(obj)
188+
target_elt = self.get_target_elt(obj, module_result=result)
189189
self.assertIsNotNone(target_elt)
190190
self.check_target_elt(obj, target_elt, **kwargs)
191191
self.assertEqual(result['commands'], command)

tests/unit/plugins/modules/test_pfsense_authserver_ldap.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def runTest():
3030
""" dummy function needed to instantiate this test module from another in python 2.7 """
3131
pass
3232

33-
def get_target_elt(self, obj, absent=False):
33+
def get_target_elt(self, obj, absent=False, module_result=None):
3434
""" return target elt from XML """
3535
root_elt = self.assert_find_xml_elt(self.xml_result, 'system')
3636
result = root_elt.findall("authserver[name='{0}']".format(obj['name']))

tests/unit/plugins/modules/test_pfsense_authserver_radius.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def runTest():
3030
""" dummy function needed to instantiate this test module from another in python 2.7 """
3131
pass
3232

33-
def get_target_elt(self, obj, absent=False):
33+
def get_target_elt(self, obj, absent=False, module_result=None):
3434
""" return target elt from XML """
3535
root_elt = self.assert_find_xml_elt(self.xml_result, 'system')
3636
result = root_elt.findall("authserver[name='{0}']".format(obj['name']))

tests/unit/plugins/modules/test_pfsense_ca.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def runTest():
7171
""" dummy function needed to instantiate this test module from another in python 2.7 """
7272
pass
7373

74-
def get_target_elt(self, obj, absent=False):
74+
def get_target_elt(self, obj, absent=False, module_result=None):
7575
""" return target elt from XML """
7676
root_elt = self.xml_result.getroot()
7777
result = root_elt.findall("ca[descr='{0}']".format(obj['name']))

tests/unit/plugins/modules/test_pfsense_dhcp_static.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,24 @@ def check_target_elt(self, obj, target_elt, target_idx=-1):
4444
# Defaulted options
4545
self.check_param_equal(obj, target_elt, 'ddnsdomainkeyalgorithm', default='hmac-md5')
4646

47-
def get_target_elt(self, obj, absent=False):
47+
def get_target_elt(self, obj, absent=False, module_result=None):
4848
""" get the generated xml definition """
4949
dhcpd_elt = self.assert_find_xml_elt(self.xml_result, 'dhcpd')
50+
root_elt = None
5051
for e in dhcpd_elt:
51-
if 'netif' not in obj or e.tag == obj['netif']:
52+
if 'netif' not in obj or (module_result is not None and e.tag == module_result['netif']):
5253
if e.find('enable') is not None:
5354
root_elt = e
5455
break
5556

56-
if 'name' in obj and 'macaddr' in obj:
57-
result = root_elt.findall("staticmap[cid='{0}'][mac='{1}']".format(obj['name'], obj['macaddr']))
58-
elif 'name' in obj:
59-
result = root_elt.findall("staticmap[cid='{0}']".format(obj['name']))
60-
else:
61-
result = root_elt.findall("staticmap[mac='{0}']".format(obj['macaddr']))
57+
result = []
58+
if root_elt is not None:
59+
if 'name' in obj and 'macaddr' in obj:
60+
result = root_elt.findall("staticmap[cid='{0}'][mac='{1}']".format(obj['name'], obj['macaddr']))
61+
elif 'name' in obj:
62+
result = root_elt.findall("staticmap[cid='{0}']".format(obj['name']))
63+
else:
64+
result = root_elt.findall("staticmap[mac='{0}']".format(obj['macaddr']))
6265

6366
if len(result) == 1:
6467
return result[0]
@@ -86,6 +89,14 @@ def test_dhcp_static_create_empty(self):
8689
)
8790
self.do_module_test(obj, command=command)
8891

92+
def test_dhcp_static_create_display(self):
93+
""" test create with netif display name """
94+
obj = dict(name='test_entry', macaddr='ab:ab:ab:ab:ab:ac', ipaddr='10.0.0.101', netif='pub')
95+
command = (
96+
"create dhcp_static 'test_entry', macaddr='ab:ab:ab:ab:ab:ac', ipaddr='10.0.0.101'"
97+
)
98+
self.do_module_test(obj, command=command)
99+
89100
def test_dhcp_static_create_wrong_subnet(self):
90101
""" test create with IP address in the wrong subnet """
91102
obj = dict(name='test_entry', macaddr='ab:ab:ab:ab:ab:ab', ipaddr='1.2.3.4', netif='opt1')
@@ -96,6 +107,11 @@ def test_dhcp_static_create_no_netif(self):
96107
obj = dict(name='test_entry', macaddr='ab:ab:ab:ab:ab:ab', ipaddr='1.2.3.4')
97108
self.do_module_test(obj, failed=True, msg='Multiple DHCP servers enabled and no netif specified')
98109

110+
def test_dhcp_static_create_ifgroup(self):
111+
""" test create with interface group """
112+
obj = dict(name='test_entry', macaddr='ab:ab:ab:ab:ab:ab', ipaddr='1.2.3.4', netif='IFGROUP1')
113+
self.do_module_test(obj, failed=True, msg='DHCP cannot be configured for interface groups')
114+
99115
def test_dhcp_static_create_invalid_macaddr(self):
100116
""" test create with invalid macaddr """
101117
msg = 'A valid MAC address must be specified.'

tests/unit/plugins/modules/test_pfsense_gateway.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def check_target_elt(self, obj, target_elt):
4141
self.check_param_equal(obj, target_elt, 'gateway')
4242
self.check_param_equal(obj, target_elt, 'ipprotocol', 'inet')
4343

44-
def get_target_elt(self, obj, absent=False):
44+
def get_target_elt(self, obj, absent=False, module_result=None):
4545
""" get the generated xml definition """
4646
rules_elt = self.assert_find_xml_elt(self.xml_result, 'gateways')
4747

tests/unit/plugins/modules/test_pfsense_haproxy_backend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def __init__(self, *args, **kwargs):
2727
##############
2828
# tests utils
2929
#
30-
def get_target_elt(self, obj, absent=False):
30+
def get_target_elt(self, obj, absent=False, module_result=None):
3131
""" get the generated backend xml definition """
3232
pkgs_elt = self.assert_find_xml_elt(self.xml_result, 'installedpackages')
3333
hap_elt = self.assert_find_xml_elt(pkgs_elt, 'haproxy')

tests/unit/plugins/modules/test_pfsense_haproxy_backend_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def __init__(self, *args, **kwargs):
2727
##############
2828
# tests utils
2929
#
30-
def get_target_elt(self, obj, absent=False):
30+
def get_target_elt(self, obj, absent=False, module_result=None):
3131
""" get the generated backend server xml definition """
3232
pkgs_elt = self.assert_find_xml_elt(self.xml_result, 'installedpackages')
3333
hap_elt = self.assert_find_xml_elt(pkgs_elt, 'haproxy')

0 commit comments

Comments
 (0)