Skip to content

Commit 4907e61

Browse files
authored
Merge pull request saltstack#55077 from garethgreenaway/55061_fix_network_settings_beacon_wildcard_interface
[master] fixes to network_settings beacon
2 parents 012358e + f0e7ac8 commit 4907e61

File tree

2 files changed

+97
-10
lines changed

2 files changed

+97
-10
lines changed

salt/beacons/network_settings.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
IP = IPDB()
1313
HAS_PYROUTE2 = True
1414
except ImportError:
15+
IP = None
1516
HAS_PYROUTE2 = False
1617

1718
import ast
@@ -139,7 +140,7 @@ def beacon(config):
139140

140141
ret = []
141142
interfaces = []
142-
expanded_config = {}
143+
expanded_config = {'interfaces': {}}
143144

144145
global LAST_STATS
145146

@@ -157,20 +158,19 @@ def beacon(config):
157158
log.debug('_stats %s', _stats)
158159
# Get list of interfaces included in config that are registered in the
159160
# system, including interfaces defined by wildcards (eth*, wlan*)
160-
for interface in _config.get('interfaces', {}):
161-
if interface in _stats:
162-
interfaces.append(interface)
161+
for interface_config in _config.get('interfaces', {}):
162+
if interface_config in _stats:
163+
interfaces.append(interface_config)
163164
else:
164165
# No direct match, try with * wildcard regexp
165-
interface_regexp = interface.replace('*', '[0-9]+')
166-
for interface in _stats:
167-
match = re.search(interface_regexp, interface)
166+
for interface_stat in _stats:
167+
match = re.search(interface_config, interface_stat)
168168
if match:
169-
interfaces.append(match.group())
170-
expanded_config[match.group()] = config['interfaces'][interface]
169+
interfaces.append(interface_stat)
170+
expanded_config['interfaces'][interface_stat] = _config['interfaces'][interface_config]
171171

172172
if expanded_config:
173-
config.update(expanded_config)
173+
_config['interfaces'].update(expanded_config['interfaces'])
174174

175175
# config updated so update _config
176176
list(map(_config.update, config))

tests/unit/beacons/test_network_settings.py

+87
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
# Salt testing libs
77
from tests.support.unit import skipIf, TestCase
8+
from tests.support.mock import patch, MagicMock
89
from tests.support.mixins import LoaderModuleMockMixin
910
try:
1011
from pyroute2 import IPDB
@@ -19,6 +20,15 @@
1920
log = logging.getLogger(__name__)
2021

2122

23+
class MockIPClass(object):
24+
def __init__(self, *args, **kwargs):
25+
self.args = args
26+
self.kwargs = kwargs
27+
28+
def by_name(self):
29+
return {}
30+
31+
2232
class NetworkSettingsBeaconTestCase(TestCase, LoaderModuleMockMixin):
2333
'''
2434
Test case for salt.beacons.network_settings
@@ -47,6 +57,83 @@ def test_empty_config(self):
4757

4858
self.assertEqual(ret, (True, 'Valid beacon configuration'))
4959

60+
def test_interface(self):
61+
config = [{'interfaces': {'enp14s0u1u2': {'promiscuity': None}}}]
62+
LAST_STATS = network_settings._copy_interfaces_info({'enp14s0u1u2': {'family': '0',
63+
'promiscuity': '0',
64+
'group': '0'}})
65+
66+
NEW_STATS = network_settings._copy_interfaces_info({'enp14s0u1u2': {'family': '0',
67+
'promiscuity': '1',
68+
'group': '0'}})
69+
70+
ret = network_settings.validate(config)
71+
self.assertEqual(ret, (True, 'Valid beacon configuration'))
72+
73+
with patch.object(network_settings, 'LAST_STATS', {}), \
74+
patch.object(network_settings, 'IP', MockIPClass), \
75+
patch('salt.beacons.network_settings._copy_interfaces_info',
76+
MagicMock(side_effect=[LAST_STATS, NEW_STATS])):
77+
ret = network_settings.beacon(config)
78+
self.assertEqual(ret, [])
79+
80+
ret = network_settings.beacon(config)
81+
_expected = [{'interface': 'enp14s0u1u2',
82+
'tag': 'enp14s0u1u2',
83+
'change': {'promiscuity': '1'}
84+
}]
85+
self.assertEqual(ret, _expected)
86+
87+
def test_interface_no_change(self):
88+
config = [{'interfaces': {'enp14s0u1u2': {'promiscuity': None}}}]
89+
LAST_STATS = network_settings._copy_interfaces_info({'enp14s0u1u2': {'family': '0',
90+
'promiscuity': '0',
91+
'group': '0'}})
92+
93+
NEW_STATS = network_settings._copy_interfaces_info({'enp14s0u1u2': {'family': '0',
94+
'promiscuity': '0',
95+
'group': '0'}})
96+
97+
ret = network_settings.validate(config)
98+
self.assertEqual(ret, (True, 'Valid beacon configuration'))
99+
100+
with patch.object(network_settings, 'LAST_STATS', {}), \
101+
patch.object(network_settings, 'IP', MockIPClass), \
102+
patch('salt.beacons.network_settings._copy_interfaces_info',
103+
MagicMock(side_effect=[LAST_STATS, NEW_STATS])):
104+
ret = network_settings.beacon(config)
105+
self.assertEqual(ret, [])
106+
107+
ret = network_settings.beacon(config)
108+
self.assertEqual(ret, [])
109+
110+
def test_wildcard_interface(self):
111+
config = [{'interfaces': {'en*': {'promiscuity': None}}}]
112+
LAST_STATS = network_settings._copy_interfaces_info({'enp14s0u1u2': {'family': '0',
113+
'promiscuity': '0',
114+
'group': '0'}})
115+
116+
NEW_STATS = network_settings._copy_interfaces_info({'enp14s0u1u2': {'family': '0',
117+
'promiscuity': '1',
118+
'group': '0'}})
119+
120+
ret = network_settings.validate(config)
121+
self.assertEqual(ret, (True, 'Valid beacon configuration'))
122+
123+
with patch.object(network_settings, 'LAST_STATS', {}), \
124+
patch.object(network_settings, 'IP', MockIPClass), \
125+
patch('salt.beacons.network_settings._copy_interfaces_info',
126+
MagicMock(side_effect=[LAST_STATS, NEW_STATS])):
127+
ret = network_settings.beacon(config)
128+
self.assertEqual(ret, [])
129+
130+
ret = network_settings.beacon(config)
131+
_expected = [{'interface': 'enp14s0u1u2',
132+
'tag': 'enp14s0u1u2',
133+
'change': {'promiscuity': '1'}
134+
}]
135+
self.assertEqual(ret, _expected)
136+
50137

51138
@skipIf(not HAS_PYROUTE2, 'no pyroute2 installed, skipping')
52139
class Pyroute2TestCase(TestCase):

0 commit comments

Comments
 (0)