Charmed-Kubernetes/nrpe/tests/unit/test_nrpe_helpers.py

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")