Skip to content

Commit

Permalink
[dhcp_static] Allow use of display name for netif; Error in case a in…
Browse files Browse the repository at this point in the history
…terface group name is specified; Fixes #79
  • Loading branch information
opoplawski committed Dec 18, 2023
1 parent dada6d7 commit d3ecc50
Show file tree
Hide file tree
Showing 25 changed files with 69 additions and 35 deletions.
17 changes: 14 additions & 3 deletions plugins/modules/pfsense_dhcp_static.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,11 @@
"""

RETURN = """
netif:
description: The selected interface
returned: success
type: str
sample: 'lan'
"""

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

if params['netif'] is not None:
self.pfsense.parse_interface(params['netif'])
if self.pfsense.is_interface_group(params['netif']):
self.module.fail_json(msg='DHCP cannot be configured for interface groups')
else:
netif = self.pfsense.parse_interface(params['netif'])
else:
netif = None

# find staticmaps and determine interface
self._find_staticmaps(params['netif'])
self._find_staticmaps(netif)

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

self.result['netif'] = netif

def _find_target(self):
if self.params['name'] is not None and self.params['macaddr'] is not None:
result = self.root_elt.findall("staticmap[cid='{0}'][mac='{1}']".format(self.params['name'], self.params['macaddr']))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1741,6 +1741,13 @@
<domain>acme.com</domain>
</system>
</wizardtemp>
<ifgroups>
<ifgroupentry>
<members>opt1 opt2 opt3</members>
<descr></descr>
<ifname>IFGROUP1</ifname>
</ifgroupentry>
</ifgroups>
<vlans>
<vlan>
<if>vmx0</if>
Expand Down
6 changes: 3 additions & 3 deletions tests/unit/plugins/modules/pfsense_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def get_args_fields(self):
except AttributeError:
raise NotImplementedError()

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" return target elt from XML """
raise NotImplementedError()

Expand Down Expand Up @@ -180,12 +180,12 @@ def do_module_test(self, obj, command=None, changed=True, failed=False, msg=None
self.assertEqual(result['commands'], [])
elif delete:
self.assertTrue(self.load_xml_result())
target_elt = self.get_target_elt(obj, absent=True)
target_elt = self.get_target_elt(obj, absent=True, module_result=result)
self.assertIsNone(target_elt)
self.assertEqual(result['commands'], command)
else:
self.assertTrue(self.load_xml_result())
target_elt = self.get_target_elt(obj)
target_elt = self.get_target_elt(obj, module_result=result)
self.assertIsNotNone(target_elt)
self.check_target_elt(obj, target_elt, **kwargs)
self.assertEqual(result['commands'], command)
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_authserver_ldap.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def runTest():
""" dummy function needed to instantiate this test module from another in python 2.7 """
pass

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" return target elt from XML """
root_elt = self.assert_find_xml_elt(self.xml_result, 'system')
result = root_elt.findall("authserver[name='{0}']".format(obj['name']))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def runTest():
""" dummy function needed to instantiate this test module from another in python 2.7 """
pass

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" return target elt from XML """
root_elt = self.assert_find_xml_elt(self.xml_result, 'system')
result = root_elt.findall("authserver[name='{0}']".format(obj['name']))
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_ca.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def runTest():
""" dummy function needed to instantiate this test module from another in python 2.7 """
pass

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" return target elt from XML """
root_elt = self.xml_result.getroot()
result = root_elt.findall("ca[descr='{0}']".format(obj['name']))
Expand Down
32 changes: 24 additions & 8 deletions tests/unit/plugins/modules/test_pfsense_dhcp_static.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,24 @@ def check_target_elt(self, obj, target_elt, target_idx=-1):
# Defaulted options
self.check_param_equal(obj, target_elt, 'ddnsdomainkeyalgorithm', default='hmac-md5')

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated xml definition """
dhcpd_elt = self.assert_find_xml_elt(self.xml_result, 'dhcpd')
root_elt = None
for e in dhcpd_elt:
if 'netif' not in obj or e.tag == obj['netif']:
if 'netif' not in obj or (module_result is not None and e.tag == module_result['netif']):
if e.find('enable') is not None:
root_elt = e
break

if 'name' in obj and 'macaddr' in obj:
result = root_elt.findall("staticmap[cid='{0}'][mac='{1}']".format(obj['name'], obj['macaddr']))
elif 'name' in obj:
result = root_elt.findall("staticmap[cid='{0}']".format(obj['name']))
else:
result = root_elt.findall("staticmap[mac='{0}']".format(obj['macaddr']))
result = []
if root_elt is not None:
if 'name' in obj and 'macaddr' in obj:
result = root_elt.findall("staticmap[cid='{0}'][mac='{1}']".format(obj['name'], obj['macaddr']))
elif 'name' in obj:
result = root_elt.findall("staticmap[cid='{0}']".format(obj['name']))
else:
result = root_elt.findall("staticmap[mac='{0}']".format(obj['macaddr']))

if len(result) == 1:
return result[0]
Expand Down Expand Up @@ -86,6 +89,14 @@ def test_dhcp_static_create_empty(self):
)
self.do_module_test(obj, command=command)

def test_dhcp_static_create_display(self):
""" test create with netif display name """
obj = dict(name='test_entry', macaddr='ab:ab:ab:ab:ab:ac', ipaddr='10.0.0.101', netif='pub')
command = (
"create dhcp_static 'test_entry', macaddr='ab:ab:ab:ab:ab:ac', ipaddr='10.0.0.101'"
)
self.do_module_test(obj, command=command)

def test_dhcp_static_create_wrong_subnet(self):
""" test create with IP address in the wrong subnet """
obj = dict(name='test_entry', macaddr='ab:ab:ab:ab:ab:ab', ipaddr='1.2.3.4', netif='opt1')
Expand All @@ -96,6 +107,11 @@ def test_dhcp_static_create_no_netif(self):
obj = dict(name='test_entry', macaddr='ab:ab:ab:ab:ab:ab', ipaddr='1.2.3.4')
self.do_module_test(obj, failed=True, msg='Multiple DHCP servers enabled and no netif specified')

def test_dhcp_static_create_ifgroup(self):
""" test create with interface group """
obj = dict(name='test_entry', macaddr='ab:ab:ab:ab:ab:ab', ipaddr='1.2.3.4', netif='IFGROUP1')
self.do_module_test(obj, failed=True, msg='DHCP cannot be configured for interface groups')

def test_dhcp_static_create_invalid_macaddr(self):
""" test create with invalid macaddr """
msg = 'A valid MAC address must be specified.'
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def check_target_elt(self, obj, target_elt):
self.check_param_equal(obj, target_elt, 'gateway')
self.check_param_equal(obj, target_elt, 'ipprotocol', 'inet')

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

Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_haproxy_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def __init__(self, *args, **kwargs):
##############
# tests utils
#
def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated backend xml definition """
pkgs_elt = self.assert_find_xml_elt(self.xml_result, 'installedpackages')
hap_elt = self.assert_find_xml_elt(pkgs_elt, 'haproxy')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def __init__(self, *args, **kwargs):
##############
# tests utils
#
def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated backend server xml definition """
pkgs_elt = self.assert_find_xml_elt(self.xml_result, 'installedpackages')
hap_elt = self.assert_find_xml_elt(pkgs_elt, 'haproxy')
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def tearDown(self):
##############
# tests utils
#
def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated interface xml definition """
elt_filter = {}
elt_filter['descr'] = obj['descr']
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_ipsec.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def get_config_file(self):
##############
# tests utils
#
def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated ipsec xml definition """
elt_filter = {}
elt_filter['descr'] = obj['descr']
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_ipsec_p2.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def get_phase1_elt(self, descr, absent=False):
elt_filter['descr'] = descr
return self.assert_has_xml_tag('ipsec', elt_filter, absent=absent)

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated phase2 xml definition """
phase1_elt = self.get_phase1_elt(obj['p1_descr'])

Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_ipsec_proposal.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def get_config_file(self):
##############
# tests utils
#
def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated proposal xml definition """
elt_filter = {}
elt_filter['descr'] = obj['descr']
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_log_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def __init__(self, *args, **kwargs):
##############
# tests utils
#
def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated xml definition """
return self.assert_find_xml_elt(self.xml_result, 'syslog')

Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_nat_outbound.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ def check_rule_idx(self, params, target_idx):
return
self.fail('rule not found ' + str(idx))

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated xml definition """
nat_elt = self.assert_find_xml_elt(self.xml_result, 'nat')
outbount_elt = self.assert_find_xml_elt(nat_elt, 'outbound')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ def check_rule_idx(self, params, target_idx):
return
self.fail('rule not found ' + str(idx))

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated xml definition """
rules_elt = self.assert_find_xml_elt(self.xml_result, 'nat')

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def runTest():
""" dummy function needed to instantiate this test module from another in python 2.7 """
pass

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" return target elt from XML """
root_elt = self.xml_result.getroot().find('openvpn')
result = root_elt.findall("openvpn-csc[common_name='{0}']".format(obj['name']))
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_openvpn_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def runTest():
""" dummy function needed to instantiate this test module from another in python 2.7 """
pass

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" return target elt from XML """
root_elt = self.xml_result.getroot().find('openvpn')
result = root_elt.findall("openvpn-server[description='{0}']".format(obj['name']))
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_route.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def check_target_elt(self, obj, target_elt):
self.check_param_equal(obj, target_elt, 'gateway')
self.check_param_equal(obj, target_elt, 'network')

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated xml definition """
root_elt = self.assert_find_xml_elt(self.xml_result, 'staticroutes')

Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def check_rule_elt_addr(self, rule, rule_elt, addr):
if 'not' not in addr_dict:
self.assert_not_find_xml_elt(addr_elt, 'not')

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" return target elt from XML """
obj['interface'] = self.unalias_interface(obj['interface'])
if 'floating' in obj and obj['floating'] == 'yes':
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_rule_separator.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def __init__(self, *args, **kwargs):
self.config_file = 'pfsense_rule_separator_config.xml'
self.pfmodule = PFSenseRuleSeparatorModule

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get separator from XML """
if obj.get('floating'):
interface = 'floatingrules'
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def tearDown(self):
##############
# tests utils
#
def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated xml definition """
return self.assert_find_xml_elt(self.xml_result, 'system')

Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def runTest():
""" dummy function needed to instantiate this test module from another in python 2.7 """
pass

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" return target elt from XML """
root_elt = self.assert_find_xml_elt(self.xml_result, 'system')
result = root_elt.findall("user[name='{0}']".format(obj['name']))
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/test_pfsense_vlan.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def __init__(self, *args, **kwargs):
# tests utils
#

def get_target_elt(self, obj, absent=False):
def get_target_elt(self, obj, absent=False, module_result=None):
""" get the generated vlan xml definition """
elt_filter = {}
elt_filter['if'] = self.unalias_interface(obj['interface'], physical=True)
Expand Down

0 comments on commit d3ecc50

Please sign in to comment.