Skip to content

Commit 5d04c35

Browse files
authored
Merge pull request #162 from tmikuska/fix-ansible-group-host-insertion
[bugfix] Fix ansible inventory group host insertion logic
2 parents 7593524 + 9bb35aa commit 5d04c35

2 files changed

Lines changed: 100 additions & 1 deletion

File tree

tests/v2/test_ansible_inventory.py

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
from virl.generators.ansible_inventory import ansible_inventory_generator, generate_inventory_dict, render_inventory
2+
3+
4+
class FakeInterface:
5+
def __init__(self, ipv4=None, ipv6=None):
6+
self.discovered_ipv4 = ipv4 or []
7+
self.discovered_ipv6 = ipv6 or []
8+
9+
10+
class FakeNode:
11+
def __init__(self, label, node_id, definition, tags=None, interfaces=None):
12+
self.label = label
13+
self.id = node_id
14+
self.node_definition = definition
15+
self._tags = tags or []
16+
self._interfaces = interfaces or []
17+
18+
def tags(self):
19+
return self._tags
20+
21+
def interfaces(self):
22+
return self._interfaces
23+
24+
25+
class FakeLab:
26+
def __init__(self, lab_id, title, nodes):
27+
self.id = lab_id
28+
self.title = title
29+
self._nodes = nodes
30+
31+
def nodes(self):
32+
return self._nodes
33+
34+
35+
class FakeServer:
36+
host = "example.local"
37+
user = "cml-user"
38+
39+
40+
def test_generate_inventory_places_tagged_nodes_into_children_group():
41+
node = FakeNode(
42+
label="rtr-1",
43+
node_id="node1",
44+
definition="iosv",
45+
tags=["ansible_group=routers"],
46+
interfaces=[FakeInterface(ipv4=["10.0.0.1"])],
47+
)
48+
lab = FakeLab("lab-id", "Demo Lab", [node])
49+
50+
inventory = generate_inventory_dict(lab, FakeServer)
51+
52+
assert "routers" in inventory["all"]["children"]
53+
assert "rtr-1" in inventory["all"]["children"]["routers"]
54+
entry = inventory["all"]["children"]["routers"]["rtr-1"]
55+
assert entry["ansible_host"] == "10.0.0.1"
56+
assert entry["device_type"] == "ios"
57+
58+
59+
def test_generate_inventory_uses_unknown_device_type_when_not_mapped():
60+
node = FakeNode(
61+
label="custom-1",
62+
node_id="node1",
63+
definition="custom-os",
64+
interfaces=[FakeInterface(ipv4=["10.0.0.5"])],
65+
)
66+
lab = FakeLab("lab-id", "Demo Lab", [node])
67+
68+
inventory = generate_inventory_dict(lab, FakeServer)
69+
70+
assert inventory["all"]["hosts"]["custom-1"]["device_type"] == "unknown"
71+
72+
73+
def test_render_inventory_returns_none_for_unsupported_style():
74+
node = FakeNode(
75+
label="rtr-1",
76+
node_id="node1",
77+
definition="iosv",
78+
interfaces=[FakeInterface(ipv4=["10.0.0.1"])],
79+
)
80+
lab = FakeLab("lab-id", "Demo Lab", [node])
81+
82+
assert render_inventory(lab, FakeServer, "json") is None
83+
84+
85+
def test_ansible_inventory_generator_renders_ini_style():
86+
node = FakeNode(
87+
label="rtr-1",
88+
node_id="node1",
89+
definition="iosv",
90+
tags=["ansible_group=routers"],
91+
interfaces=[FakeInterface(ipv4=["10.0.0.1"])],
92+
)
93+
lab = FakeLab("lab-id", "Demo Lab", [node])
94+
95+
rendered = ansible_inventory_generator(lab, FakeServer, style="ini")
96+
97+
assert rendered is not None
98+
assert "[routers]" in rendered
99+
assert "rtr-1" in rendered

virl/generators/ansible_inventory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def generate_inventory_dict(lab, server):
5757
print("Placing {} into ansible group {}".format(name, ansible_group))
5858
if ansible_group not in inventory["all"]["children"]:
5959
inventory["all"]["children"][ansible_group] = dict()
60-
if name not in inventory["all"]["children"]:
60+
if name not in inventory["all"]["children"][ansible_group]:
6161
inventory["all"]["children"][ansible_group][name] = entry
6262
else:
6363
inventory["all"]["hosts"][name] = entry

0 commit comments

Comments
 (0)