119 lines
4.4 KiB
Python
119 lines
4.4 KiB
Python
"""Unit tests for hooks/nrpe_helpers.py module."""
|
|
import unittest
|
|
from unittest import mock
|
|
|
|
import netifaces
|
|
|
|
import nrpe_helpers
|
|
from nrpe_helpers import match_cidr_to_ifaces
|
|
|
|
|
|
class TestMatchCidrToIfaces(unittest.TestCase):
|
|
"""Test match_cidr_to_ifaces helper function."""
|
|
|
|
mock_iface_ip_data = {
|
|
"lo": "127.0.0.1",
|
|
"eno1": "10.0.0.0",
|
|
"eno2": "10.1.0.0",
|
|
"fan-252": "252.0.0.1",
|
|
}
|
|
|
|
def test_single_dev_match(self):
|
|
"""Test single interface match."""
|
|
self._run_mocked_test("10.0.0.0/16", ["eno1"])
|
|
|
|
def test_multi_dev_match(self):
|
|
"""Test multiple interface match."""
|
|
self._run_mocked_test("10.0.0.0/8", ["eno1", "eno2"])
|
|
|
|
def test_no_dev_match(self):
|
|
"""Test no interface match."""
|
|
self._run_mocked_test("192.168.0.0/16", [])
|
|
|
|
def test_cidr_with_host_bits_set(self):
|
|
"""Test invalid CIDR input (e.g. "eno1")."""
|
|
with self.assertRaises(Exception):
|
|
match_cidr_to_ifaces("10.1.2.3/8") # Should be 10.0.0.0/8
|
|
|
|
def test_iface_passed_in_as_cidr(self):
|
|
"""Test invalid CIDR input (e.g. "eno1")."""
|
|
with self.assertRaises(Exception):
|
|
match_cidr_to_ifaces("eno1")
|
|
|
|
@mock.patch("netifaces.ifaddresses")
|
|
@mock.patch("netifaces.interfaces")
|
|
def _run_mocked_test(self, cidr, matches, ifaces_mock, addrs_mock):
|
|
iface_ip_tuples = list(self.mock_iface_ip_data.items())
|
|
ifaces_mock.return_value = [t[0] for t in iface_ip_tuples]
|
|
addrs_mock.side_effect = [
|
|
{netifaces.AF_INET: [{"addr": t[1]}]} for t in iface_ip_tuples
|
|
]
|
|
self.assertEqual(match_cidr_to_ifaces(cidr), matches)
|
|
|
|
|
|
class TestIngressAddress(unittest.TestCase):
|
|
"""Test functions to provide a suitable ingress address."""
|
|
|
|
@mock.patch("nrpe_helpers.hookenv.config")
|
|
@mock.patch("nrpe_helpers.hookenv.network_get")
|
|
def test_get_bind_address(self, mock_network_get, mock_config):
|
|
"""Prove we get a local IP address for interface binding."""
|
|
mock_config.return_value = "private"
|
|
mock_network_get.return_value = {
|
|
"bind-addresses": [
|
|
{
|
|
"mac-address": "06:f1:3a:74:ad:fe",
|
|
"interface-name": "ens5",
|
|
"addresses": [
|
|
{
|
|
"hostname": "",
|
|
"address": "172.31.29.247",
|
|
"cidr": "172.31.16.0/20",
|
|
}
|
|
],
|
|
"macaddress": "06:f1:3a:74:ad:fe",
|
|
"interfacename": "ens5",
|
|
}
|
|
],
|
|
"egress-subnets": ["3.8.134.119/32"],
|
|
"ingress-addresses": ["3.8.134.119"],
|
|
}
|
|
self.assertEqual(nrpe_helpers.get_ingress_address("mockbinding"),
|
|
"172.31.29.247")
|
|
|
|
@mock.patch("nrpe_helpers.hookenv.config")
|
|
@mock.patch("nrpe_helpers.hookenv.network_get")
|
|
def test_get_private_address(self, mock_network_get, mock_config):
|
|
"""Prove we get a local IP address for Nagios relation."""
|
|
mock_config.return_value = "private"
|
|
mock_network_get.return_value = {
|
|
"bind-addresses": [
|
|
{
|
|
"mac-address": "06:f1:3a:74:ad:fe",
|
|
"interface-name": "ens5",
|
|
"addresses": [
|
|
{
|
|
"hostname": "",
|
|
"address": "172.31.29.247",
|
|
"cidr": "172.31.16.0/20",
|
|
}
|
|
],
|
|
"macaddress": "06:f1:3a:74:ad:fe",
|
|
"interfacename": "ens5",
|
|
}
|
|
],
|
|
"egress-subnets": ["3.8.134.119/32"],
|
|
"ingress-addresses": ["3.8.134.119"],
|
|
}
|
|
self.assertEqual(nrpe_helpers.get_ingress_address("mockbinding", external=True),
|
|
"172.31.29.247")
|
|
|
|
@mock.patch("nrpe_helpers.hookenv.config")
|
|
@mock.patch("nrpe_helpers.hookenv.unit_get")
|
|
def test_get_public_address(self, mock_unit_get, mock_config):
|
|
"""Prove we get a public IP address for Nagios relation."""
|
|
mock_config.return_value = "public"
|
|
mock_unit_get.return_value = "1.2.3.4"
|
|
self.assertEqual(nrpe_helpers.get_ingress_address("mockbinding", external=True),
|
|
"1.2.3.4")
|