Skip to content

Commit 06bee69

Browse files
omnom62Copilot
andauthored
T7391 domain search fix for 1.4+ (#418)
* t7391 init * sanity * vyos_system unit test * added vyos_system v14 test cases * vyos_system integration tests fix * changelog * domain search integration test * Update plugins/modules/vyos_system.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 2879b9a commit 06bee69

File tree

7 files changed

+159
-16
lines changed

7 files changed

+159
-16
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
trivial:
3+
- vyos_system - Added support for domain_search for 1.4+
4+
- test_vyos_system - Added test for domain_search

plugins/module_utils/network/vyos/vyos.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ def get_capabilities(module):
6868
def get_config(module, flags=None, format=None):
6969
flags = [] if flags is None else flags
7070
global _DEVICE_CONFIGS
71+
7172
# If _DEVICE_CONFIGS is non-empty and module.params["match"] is "none",
7273
# return the cached device configurations. This avoids redundant calls
7374
# to the connection when no specific match criteria are provided.

plugins/modules/vyos_system.py

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
# You should have received a copy of the GNU General Public License
1717
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
1818
#
19+
1920
from __future__ import absolute_import, division, print_function
2021

2122

@@ -94,21 +95,27 @@
9495
- sub1.example.com
9596
- sub2.example.com
9697
"""
98+
from re import M, findall
9799

98100
from ansible.module_utils.basic import AnsibleModule
99101

102+
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.version import (
103+
LooseVersion,
104+
)
100105
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import (
101106
get_config,
107+
get_os_version,
102108
load_config,
103109
)
104110

105111

106-
def spec_key_to_device_key(key):
112+
def spec_key_to_device_key(key, module):
107113
device_key = key.replace("_", "-")
108114

109-
# domain-search is longer than just it's key
115+
# domain-search differs in 1.3- and 1.4+
110116
if device_key == "domain-search":
111-
device_key += " domain"
117+
if LooseVersion(get_os_version(module)) <= LooseVersion("1.3"):
118+
device_key += " domain"
112119

113120
return device_key
114121

@@ -119,19 +126,20 @@ def config_to_dict(module):
119126
config = {"domain_search": [], "name_server": []}
120127

121128
for line in data.split("\n"):
122-
if line.startswith("set system host-name"):
123-
config["host_name"] = line[22:-1]
124-
elif line.startswith("set system domain-name"):
125-
config["domain_name"] = line[24:-1]
126-
elif line.startswith("set system domain-search domain"):
127-
config["domain_search"].append(line[33:-1])
128-
elif line.startswith("set system name-server"):
129-
config["name_server"].append(line[24:-1])
130-
129+
config_line = findall(r"^set system\s+(\S+)(?:\s+domain)?\s+'([^']+)'", line, M)
130+
if config_line:
131+
if config_line[0][0] == "host-name":
132+
config["host_name"] = config_line[0][1]
133+
elif config_line[0][0] == "domain-name":
134+
config["domain_name"] = config_line[0][1]
135+
elif config_line[0][0] == "domain-search":
136+
config["domain_search"].append(config_line[0][1])
137+
elif config_line[0][0] == "name-server":
138+
config["name_server"].append(config_line[0][1])
131139
return config
132140

133141

134-
def spec_to_commands(want, have):
142+
def spec_to_commands(want, have, module):
135143
commands = []
136144

137145
state = want.pop("state")
@@ -140,15 +148,15 @@ def spec_to_commands(want, have):
140148
if state == "absent" and all(v is None for v in want.values()):
141149
# Clear everything
142150
for key in have:
143-
commands.append("delete system %s" % spec_key_to_device_key(key))
151+
commands.append("delete system %s" % spec_key_to_device_key(key, module))
144152

145153
for key in want:
146154
if want[key] is None:
147155
continue
148156

149157
current = have.get(key)
150158
proposed = want[key]
151-
device_key = spec_key_to_device_key(key)
159+
device_key = spec_key_to_device_key(key, module)
152160

153161
# These keys are lists which may need to be reconciled with the device
154162
if key in ["domain_search", "name_server"]:
@@ -201,7 +209,7 @@ def main():
201209
want = map_param_to_obj(module)
202210
have = config_to_dict(module)
203211

204-
commands = spec_to_commands(want, have)
212+
commands = spec_to_commands(want, have, module)
205213
result["commands"] = commands
206214

207215
if commands:
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
---
2+
- debug: msg="START cli/domain_search.yaml on connection={{ ansible_connection }}"
3+
4+
- name: ensure facts
5+
include_tasks: _get_version.yaml
6+
7+
- name: setup
8+
ignore_errors: true
9+
vyos.vyos.vyos_system:
10+
domain_search:
11+
- nbg.bufanda.ke
12+
state: absent
13+
14+
- name: configure domain search setting
15+
register: result
16+
vyos.vyos.vyos_system:
17+
domain_search:
18+
- nbg.bufanda.ke
19+
20+
- assert:
21+
that:
22+
- result.changed == true
23+
- result.commands|length == 1
24+
- "{{ merged['commands'] | symmetric_difference(result['commands']) |length == 0 }}"
25+
26+
- name: configure domain search setting
27+
register: result
28+
vyos.vyos.vyos_system:
29+
domain_search:
30+
- nbg.bufanda.ke
31+
32+
- assert:
33+
that:
34+
- result.changed == false
35+
36+
- name: teardown
37+
ignore_errors: true
38+
vyos.vyos.vyos_system:
39+
domain_search:
40+
- nbg.bufanda.ke
41+
state: absent
42+
43+
- debug: msg="END cli/basic.yaml on connection={{ ansible_connection }}"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
merged:
3+
commands:
4+
- set system domain-search domain 'nbg.bufanda.ke'
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
merged:
3+
commands:
4+
- set system domain-search 'nbg.bufanda.ke'

tests/unit/modules/network/vyos/test_vyos_system.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,26 @@ def setUp(self):
4545
)
4646
self.load_config = self.mock_load_config.start()
4747

48+
self.mock_get_os_version = patch(
49+
"ansible_collections.vyos.vyos.plugins.modules.vyos_system.get_os_version",
50+
)
51+
self.test_version = "1.2"
52+
self.get_os_version = self.mock_get_os_version.start()
53+
self.get_os_version.return_value = self.test_version
54+
self.mock_facts_get_os_version = patch(
55+
"ansible_collections.vyos.vyos.plugins.modules.vyos_system.get_os_version",
56+
)
57+
self.get_facts_os_version = self.mock_facts_get_os_version.start()
58+
self.get_facts_os_version.return_value = self.test_version
59+
self.maxDiff = None
60+
4861
def tearDown(self):
4962
super(TestVyosSystemModule, self).tearDown()
5063

5164
self.mock_get_config.stop()
5265
self.mock_load_config.stop()
66+
self.mock_get_os_version.stop()
67+
self.mock_facts_get_os_version.stop()
5368

5469
def load_fixtures(self, commands=None, filename=None):
5570
self.get_config.return_value = load_fixture("vyos_config_config.cfg")
@@ -112,3 +127,67 @@ def test_vyos_system_clear_all(self):
112127
"delete system name-server",
113128
]
114129
self.execute_module(changed=True, commands=commands)
130+
131+
132+
class TestVyosSystemModule14(TestVyosModule):
133+
module = vyos_system
134+
135+
def setUp(self):
136+
super(TestVyosSystemModule14, self).setUp()
137+
138+
self.mock_get_config = patch(
139+
"ansible_collections.vyos.vyos.plugins.modules.vyos_system.get_config",
140+
)
141+
self.get_config = self.mock_get_config.start()
142+
143+
self.mock_load_config = patch(
144+
"ansible_collections.vyos.vyos.plugins.modules.vyos_system.load_config",
145+
)
146+
self.load_config = self.mock_load_config.start()
147+
148+
self.mock_get_os_version = patch(
149+
"ansible_collections.vyos.vyos.plugins.modules.vyos_system.get_os_version",
150+
)
151+
self.test_version = "1.4"
152+
self.get_os_version = self.mock_get_os_version.start()
153+
self.get_os_version.return_value = self.test_version
154+
self.mock_facts_get_os_version = patch(
155+
"ansible_collections.vyos.vyos.plugins.modules.vyos_system.get_os_version",
156+
)
157+
self.get_facts_os_version = self.mock_facts_get_os_version.start()
158+
self.get_facts_os_version.return_value = self.test_version
159+
self.maxDiff = None
160+
161+
def tearDown(self):
162+
super(TestVyosSystemModule14, self).tearDown()
163+
164+
self.mock_get_config.stop()
165+
self.mock_load_config.stop()
166+
self.mock_get_os_version.stop()
167+
self.mock_facts_get_os_version.stop()
168+
169+
def load_fixtures(self, commands=None, filename=None):
170+
self.get_config.return_value = load_fixture("vyos_config_config.cfg")
171+
172+
def test_vyos_system_domain_search(self):
173+
set_module_args(dict(domain_search=["foo.example.com", "bar.example.com"]))
174+
commands = [
175+
"set system domain-search 'foo.example.com'",
176+
"set system domain-search 'bar.example.com'",
177+
]
178+
self.execute_module(changed=True, commands=commands)
179+
180+
def test_vyos_system_clear_domain_search(self):
181+
set_module_args(dict(domain_search=[]))
182+
commands = ["delete system domain-search"]
183+
self.execute_module(changed=True, commands=commands)
184+
185+
def test_vyos_system_clear_all(self):
186+
set_module_args(dict(state="absent"))
187+
commands = [
188+
"delete system host-name",
189+
"delete system domain-search",
190+
"delete system domain-name",
191+
"delete system name-server",
192+
]
193+
self.execute_module(changed=True, commands=commands)

0 commit comments

Comments
 (0)