Skip to content

Commit 0f8a09d

Browse files
committed
wip - test netbox server creation:
1 parent dc4f90d commit 0f8a09d

File tree

9 files changed

+140
-19
lines changed

9 files changed

+140
-19
lines changed

dev-requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ pytest-cov
55
flake8
66
flake8-isort
77
tox
8+
mock
9+
pyfakefs

netbox_agent/ipmi.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,20 @@ class IPMI():
3535
"""
3636

3737
def __init__(self):
38-
self.ret, self.output = subprocess.getstatusoutput('ipmitool lan print')
38+
try:
39+
self.ret, self.output = subprocess.getstatusoutput('ipmitool lan print')
40+
except Exception as e:
41+
self.ret = 42
42+
self.output = str(e)
43+
3944
if self.ret != 0:
4045
logging.error('Cannot get ipmi info: {}'.format(self.output))
4146

4247
def parse(self):
43-
ret = {}
4448
if self.ret != 0:
45-
return ret
49+
return None
50+
51+
ret = {}
4652
for line in self.output.splitlines():
4753
key = line.split(':')[0].strip()
4854
value = ':'.join(line.split(':')[1:]).strip()

netbox_agent/network.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,9 @@ def reset_vlan_on_interface(self, nic, interface):
234234

235235
def create_or_update_ipmi(self):
236236
ipmi = self.get_ipmi()
237+
if ipmi is None:
238+
return None
239+
237240
mac = ipmi['MAC Address']
238241
ip = ipmi['IP Address']
239242
netmask = ipmi['Subnet Mask']

tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def get_fixture_paths(path):
1515

1616

1717
def parametrize_with_fixtures(path, base_path='tests/fixtures',
18-
argname='fixture', only_filenames=None):
18+
argname='dmi_fixture', only_filenames=None):
1919
path = os.path.join(base_path, path)
2020
fixture_paths = get_fixture_paths(path)
2121
argvalues = []

tests/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DEFAULT_DATACENTER = 'DC1'

tests/fixtures/dmidecode/HP_SL4540_Gen8

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ System Power Supply
829829
Location: Not Specified
830830
Name: Power Supply 2
831831
Manufacturer: HP
832-
Serial Number: 4242
832+
Serial Number: 4243
833833
Asset Tag: Not Specified
834834
Model Part Number: 656364-B21
835835
Revision: Not Specified
@@ -846,7 +846,7 @@ System Power Supply
846846
Location: Not Specified
847847
Name: Power Supply 3
848848
Manufacturer: HP
849-
Serial Number: 4242
849+
Serial Number: 4244
850850
Asset Tag: Not Specified
851851
Model Part Number: 656364-B21
852852
Revision: Not Specified
@@ -863,7 +863,7 @@ System Power Supply
863863
Location: Not Specified
864864
Name: Power Supply 4
865865
Manufacturer: HP
866-
Serial Number: 4242
866+
Serial Number: 4245
867867
Asset Tag: Not Specified
868868
Model Part Number: 656364-B21
869869
Revision: Not Specified

tests/network.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
'lldp/', only_filenames=[
77
'dedibox1.txt',
88
])
9-
def test_lldp_parse_with_port_desc(fixture):
10-
lldp = LLDP(fixture)
9+
def test_lldp_parse_with_port_desc(dmi_fixture):
10+
lldp = LLDP(dmi_fixture)
1111
assert lldp.get_switch_port('enp1s0f0') == 'RJ-9'
1212

1313

1414
@parametrize_with_fixtures(
1515
'lldp/', only_filenames=[
1616
'qfx.txt',
1717
])
18-
def test_lldp_parse_without_ifname(fixture):
19-
lldp = LLDP(fixture)
18+
def test_lldp_parse_without_ifname(dmi_fixture):
19+
lldp = LLDP(dmi_fixture)
2020
assert lldp.get_switch_port('eth0') == 'xe-0/0/1'

tests/server.py

Lines changed: 66 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
1+
2+
import mock
3+
import netifaces
4+
5+
from netbox_agent.config import config
6+
from netbox_agent.config import netbox_instance as nb
17
from netbox_agent.dmidecode import parse
28
from netbox_agent.server import ServerBase
9+
from netbox_agent.vendors.hp import HPHost
310
from tests.conftest import parametrize_with_fixtures
11+
from tests.constants import DEFAULT_DATACENTER
12+
from tests.utils import setup_netbox
413

514

615
@parametrize_with_fixtures('dmidecode/')
7-
def test_init(fixture):
8-
dmi = parse(fixture)
16+
def test_init(dmi_fixture):
17+
dmi = parse(dmi_fixture)
918
server = ServerBase(dmi)
1019
assert server
1120

@@ -17,8 +26,8 @@ def test_init(fixture):
1726
'HP_DL380p_Gen8',
1827
'HP_SL4540_Gen8'
1928
])
20-
def test_hp_service_tag(fixture):
21-
dmi = parse(fixture)
29+
def test_hp_service_tag(dmi_fixture):
30+
dmi = parse(dmi_fixture)
2231
server = ServerBase(dmi)
2332
assert server.get_service_tag() == '4242'
2433

@@ -27,8 +36,8 @@ def test_hp_service_tag(fixture):
2736
'dmidecode/', only_filenames=[
2837
'unknown.txt'
2938
])
30-
def test_generic_host_service_tag(fixture):
31-
dmi = parse(fixture)
39+
def test_generic_host_service_tag(dmi_fixture):
40+
dmi = parse(dmi_fixture)
3241
server = ServerBase(dmi)
3342
assert server.get_service_tag() == '42'
3443

@@ -37,7 +46,56 @@ def test_generic_host_service_tag(fixture):
3746
'dmidecode/', only_filenames=[
3847
'unknown.txt'
3948
])
40-
def test_generic_host_product_name(fixture):
41-
dmi = parse(fixture)
49+
def test_generic_host_product_name(dmi_fixture):
50+
dmi = parse(dmi_fixture)
4251
server = ServerBase(dmi)
4352
assert server.get_product_name() == 'SR'
53+
54+
55+
@mock.patch('netifaces.ifaddresses')
56+
@mock.patch('netifaces.interfaces')
57+
@parametrize_with_fixtures(
58+
'dmidecode/', only_filenames=[
59+
'HP_SL4540_Gen8',
60+
], argname='dmi_fixture')
61+
def test_create_server(
62+
mock_interfaces,
63+
mock_ifaddresses,
64+
fs,
65+
dmi_fixture,
66+
):
67+
fake_addresses = {}
68+
fake_addresses[netifaces.AF_INET] = [{'addr': '42.42.42.42', 'netmask': '255.255.255.0'}]
69+
fake_addresses[netifaces.AF_LINK] = [{'addr': 'a8:1e:84:f2:9e:69'}]
70+
71+
mock_interfaces.return_value = ['enp1s0f0']
72+
mock_ifaddresses.return_value = fake_addresses
73+
74+
dmi = parse(dmi_fixture)
75+
server = HPHost(dmi)
76+
77+
setup_netbox(
78+
DEFAULT_DATACENTER,
79+
'Server',
80+
'HP',
81+
server.get_product_name(),
82+
)
83+
84+
# Create fake /sys/class/net directory with fake interface and MAC addr
85+
fs.create_file('/tmp/enp1s0f0/address', contents='a8:1e:84:f2:9e:69')
86+
fs.create_symlink('/sys/class/net/enp1s0f0', '/tmp/enp1s0f0')
87+
88+
server.netbox_create(config)
89+
90+
# Check serial tag is correct
91+
assert server.get_service_tag() == '4242'
92+
network_card = server.network.get_netbox_network_card({'name': 'enp1s0f0', 'mac': None})
93+
94+
# Check network card is correct
95+
assert network_card.name == 'enp1s0f0'
96+
97+
# Check IP on network card
98+
ips = nb.ipam.ip_addresses.filter(
99+
interface_id=network_card.id
100+
)
101+
assert ips[0].address == '42.42.42.42/24'

tests/utils.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
2+
import pynetbox
3+
4+
from netbox_agent.config import netbox_instance as nb
5+
6+
7+
def setup_netbox(dc, device_role, manufacturer, model):
8+
try:
9+
nb_dc = nb.dcim.sites.create(
10+
name=dc,
11+
slug=dc.lower(),
12+
)
13+
except pynetbox.RequestError:
14+
nb_dc = nb.dcim.sites.get(
15+
slug=dc.lower()
16+
)
17+
18+
try:
19+
nb_manufacturer = nb.dcim.manufacturers.create(
20+
name=manufacturer,
21+
slug=manufacturer.lower(),
22+
)
23+
except pynetbox.RequestError:
24+
nb_manufacturer = nb.dcim.manufacturers.get(
25+
slug=manufacturer.lower()
26+
)
27+
28+
try:
29+
nb_device_role = nb.dcim.device_roles.create(
30+
name=device_role,
31+
slug=device_role.lower(),
32+
color='f44336',
33+
)
34+
except pynetbox.RequestError:
35+
nb_device_role = nb.dcim.device_roles.get(
36+
slug=device_role.lower(),
37+
)
38+
39+
try:
40+
nb_device_type = nb.dcim.device_types.create(
41+
model=model,
42+
slug=model.lower().replace(' ', '_'),
43+
device_role=nb_device_role.id,
44+
manufacturer=nb_manufacturer.id,
45+
)
46+
except pynetbox.RequestError:
47+
nb_device_type = nb.dcim.device_types.get(
48+
slug=model.lower().replace(' ', '_'),
49+
)
50+
51+
return nb_dc, nb_manufacturer, nb_device_role, nb_device_type

0 commit comments

Comments
 (0)