Skip to content

Commit

Permalink
chore(test): Test inventory filtering
Browse files Browse the repository at this point in the history
  • Loading branch information
Antti Myyrä committed Sep 25, 2023
1 parent 922044e commit 1a64a86
Show file tree
Hide file tree
Showing 2 changed files with 151 additions and 12 deletions.
2 changes: 1 addition & 1 deletion plugins/inventory/upcloud.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
161 changes: 150 additions & 11 deletions tests/unit/plugins/inventory/test_upcloud.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -138,6 +171,9 @@ def get_server1_details():
'created': 1599136169,
'firewall': 'on',
'hostname': 'server1',
'labels': {
'label': []
},
'license': 0,
'memory_amount': '4096',
'metadata': 'no',
Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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"

0 comments on commit 1a64a86

Please sign in to comment.