From 1a64a8639fd31149fea2048395a0136fa584099b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20Myyr=C3=A4?= Date: Mon, 25 Sep 2023 16:24:07 +0300 Subject: [PATCH] chore(test): Test inventory filtering --- plugins/inventory/upcloud.py | 2 +- tests/unit/plugins/inventory/test_upcloud.py | 161 +++++++++++++++++-- 2 files changed, 151 insertions(+), 12 deletions(-) diff --git a/plugins/inventory/upcloud.py b/plugins/inventory/upcloud.py index cf49941..e408e8f 100644 --- a/plugins/inventory/upcloud.py +++ b/plugins/inventory/upcloud.py @@ -218,7 +218,7 @@ def _filter_servers(self): for wanted_label in self.get_option("labels"): server_labels = _parse_server_labels(server.labels['label']) for server_label in server_labels: - display.vvvv(f"Comparing {wanted_label} against {server_label}") + display.vvvv(f"Comparing wanted label {wanted_label} against labels {server_label} of server {server.hostname}") if wanted_label in server_label: tmp.append(server) diff --git a/tests/unit/plugins/inventory/test_upcloud.py b/tests/unit/plugins/inventory/test_upcloud.py index 8b6eedd..52535df 100644 --- a/tests/unit/plugins/inventory/test_upcloud.py +++ b/tests/unit/plugins/inventory/test_upcloud.py @@ -16,37 +16,61 @@ class Server: 'core_number', 'firewall', 'hostname', - 'metadata', + 'labels', 'memory_amount', 'nic_model', + 'plan', + 'simple_backup', 'title', 'timezone', 'video_model', 'vnc', 'vnc_password', - 'plan', ] optional_fields = [ - 'plan', - 'core_number', - 'memory_amount', + 'avoid_host', 'boot_order', + 'core_number', 'firewall', + 'labels', + 'login_user', + 'memory_amount', + 'networking', 'nic_model', + 'password_delivery', + 'plan', + 'server_group', + 'simple_backup', 'timezone', + 'metadata', + 'user_data', 'video_model', 'vnc_password', - 'password_delivery', - 'avoid_host', - 'login_user', - 'user_data', ] def __init__(self, **entries): self.__dict__.update(entries) +class Network: + """ + Simple class representation of UpCloud Network instance for testing purposes. + """ + + ATTRIBUTES = { + 'name': None, + 'type': None, + 'uuid': None, + 'zone': None, + 'ip_networks': None, + 'servers': None, + } + + def __init__(self, **entries): + self.__dict__.update(entries) + + @pytest.fixture() def inventory(): r = InventoryModule() @@ -108,7 +132,16 @@ def get_servers(): 'created': 1598526319, 'hostname': 'server3', 'labels': { - 'label': [] + 'label': [ + { + 'key': 'foo', + 'value': 'bar' + }, + { + 'key': 'private', + 'value': 'yes' + } + ] }, 'license': 0, 'memory_amount': '2048', @@ -138,6 +171,9 @@ def get_server1_details(): 'created': 1599136169, 'firewall': 'on', 'hostname': 'server1', + 'labels': { + 'label': [] + }, 'license': 0, 'memory_amount': '4096', 'metadata': 'no', @@ -253,6 +289,18 @@ def get_server3_details(): 'created': 1598526319, 'firewall': 'on', 'hostname': 'server3', + 'labels': { + 'label': [ + { + 'key': 'foo', + 'value': 'bar' + }, + { + 'key': 'private', + 'value': 'yes' + } + ] + }, 'license': 0, 'memory_amount': '2048', 'metadata': 'yes', @@ -297,6 +345,36 @@ def get_server3_details(): }) +def get_network_details(uuid): + return Network(**{ + "name": "Test private net", + "type": "private", + "uuid": uuid, + "zone": "nl-ams1", + "ip_networks": { + "ip_network": [ + { + "address": "172.16.0.0/24", + "dhcp": "yes", + "dhcp_default_route": "no", + "dhcp_dns": [ + "172.16.0.10", + "172.16.1.10" + ], + "family": "IPv4", + "gateway": "172.16.0.1" + } + ] + }, + "labels": [], + "servers": { + "server": [ + {"uuid": "0003295f-343a-44a2-8080-fb8196a6802a", "title": "Server #2"} + ] + } + }) + + def _mock_initialize_client(): return @@ -331,8 +409,69 @@ def test_populate_hostvars(inventory, mocker): assert host1.vars['id'] == "00229adf-0e46-49b5-a8f7-cbd638d11f6a" assert host1.vars['state'] == "started" + assert len(host1.vars['labels']) == 0 assert host2.vars['plan'] == "1xCPU-2GB" assert len(host2.vars['labels']) == 1 assert host2.vars['labels'][0] == "foo=bar" assert host3.vars['id'] == "0003295f-343a-44a2-8080-fb8196a6802a" - assert len(host3.vars['labels']) == 0 + assert len(host3.vars['labels']) == 2 + + +def get_filtered_labeled_option(option): + options = { + 'plugin': 'community.upcloud.upcloud', + 'labels': ['foo=bar'], + } + return options.get(option) + + +def test_filtering_with_labels(inventory, mocker): + inventory._fetch_servers = mocker.MagicMock(side_effect=get_servers) + inventory._fetch_server_details = mocker.MagicMock( + side_effects=[get_server1_details, get_server2_details, get_server3_details] + ) + inventory.get_option = mocker.MagicMock(side_effect=get_filtered_labeled_option) + + inventory._initialize_upcloud_client = _mock_initialize_client + inventory._test_upcloud_credentials = _mock_test_credentials + + inventory._populate() + + assert len(inventory.inventory.hosts) == 2 + host2 = inventory.inventory.get_host('server2') + host3 = inventory.inventory.get_host('server3') + + assert host2.vars['id'] == "004d5201-e2ff-4325-7ac6-a274f1c517b7" + assert host2.vars['labels'][0] == "foo=bar" + assert host3.vars['id'] == "0003295f-343a-44a2-8080-fb8196a6802a" + assert len(host3.vars['labels']) == 2 + assert host3.vars['labels'][1] == "private=yes" + + +def get_filtered_connect_with_option(option): + options = { + 'plugin': 'community.upcloud.upcloud', + 'connect_with': 'private_ipv4', + 'network': '035146a5-7a85-408b-b1f8-21925164a7d3' + } + return options.get(option) + + +def test_filtering_with_connect_with(inventory, mocker): + inventory._fetch_servers = mocker.MagicMock(side_effect=get_servers) + inventory._fetch_server_details = mocker.MagicMock( + side_effects=[get_server1_details, get_server2_details, get_server3_details] + ) + inventory.get_option = mocker.MagicMock(side_effect=get_filtered_connect_with_option) + + inventory._initialize_upcloud_client = _mock_initialize_client + inventory._test_upcloud_credentials = _mock_test_credentials + + inventory._fetch_network_details = get_network_details + + inventory._populate() + + assert len(inventory.inventory.hosts) == 1 + host3 = inventory.inventory.get_host('server3') + + assert host3.vars['id'] == "0003295f-343a-44a2-8080-fb8196a6802a"