1
0
mirror of https://github.com/dkmstr/openuds.git synced 2025-02-02 09:47:13 +03:00

Done ovirt provider tests

This commit is contained in:
Adolfo Gómez García 2024-03-17 02:04:54 +01:00
parent a0cb8d4778
commit 3e8405482e
No known key found for this signature in database
GPG Key ID: DD1ABF20724CDA23
5 changed files with 82 additions and 83 deletions

View File

@ -242,72 +242,72 @@ def get_id(iterable: typing.Iterable[T], id: str) -> T:
# The idea behind this is to allow testing the provider, service and deployment classes
# without the need of a real OpenStack environment
CLIENT_METHODS_INFO: typing.Final[list[AutoSpecMethodInfo]] = [
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_flavors, return_value=FLAVORS_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_flavors, returns=FLAVORS_LIST),
AutoSpecMethodInfo(
openstack_client.OpenstackClient.list_availability_zones, return_value=AVAILABILITY_ZONES_LIST
openstack_client.OpenstackClient.list_availability_zones, returns=AVAILABILITY_ZONES_LIST
),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_projects, return_value=PROJECTS_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_regions, return_value=REGIONS_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_servers, return_value=SERVERS_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_images, return_value=IMAGES_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_volume_types, return_value=VOLUMES_TYPE_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_volumes, return_value=VOLUMES_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_projects, returns=PROJECTS_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_regions, returns=REGIONS_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_servers, returns=SERVERS_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_images, returns=IMAGES_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_volume_types, returns=VOLUMES_TYPE_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_volumes, returns=VOLUMES_LIST),
AutoSpecMethodInfo(
openstack_client.OpenstackClient.list_volume_snapshots, return_value=VOLUME_SNAPSHOTS_LIST
openstack_client.OpenstackClient.list_volume_snapshots, returns=VOLUME_SNAPSHOTS_LIST
),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_networks, return_value=NETWORKS_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_ports, return_value=PORTS_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_networks, returns=NETWORKS_LIST),
AutoSpecMethodInfo(openstack_client.OpenstackClient.list_ports, returns=PORTS_LIST),
AutoSpecMethodInfo(
openstack_client.OpenstackClient.list_security_groups, return_value=SECURITY_GROUPS_LIST
openstack_client.OpenstackClient.list_security_groups, returns=SECURITY_GROUPS_LIST
),
AutoSpecMethodInfo(
openstack_client.OpenstackClient.get_server,
return_value=lambda server_id: get_id(SERVERS_LIST, server_id), # pyright: ignore
returns=lambda server_id: get_id(SERVERS_LIST, server_id), # pyright: ignore
), # pyright: ignore
AutoSpecMethodInfo(
openstack_client.OpenstackClient.get_volume,
return_value=lambda volume_id: get_id(VOLUMES_LIST, volume_id), # pyright: ignore
returns=lambda volume_id: get_id(VOLUMES_LIST, volume_id), # pyright: ignore
), # pyright: ignore
AutoSpecMethodInfo(
openstack_client.OpenstackClient.get_volume_snapshot,
return_value=lambda snapshot_id: get_id(VOLUME_SNAPSHOTS_LIST, snapshot_id), # pyright: ignore
returns=lambda snapshot_id: get_id(VOLUME_SNAPSHOTS_LIST, snapshot_id), # pyright: ignore
), # pyright: ignore
AutoSpecMethodInfo(
openstack_client.OpenstackClient.update_snapshot,
return_value=lambda snapshot_id, name, description: get_id( # pyright: ignore
returns=lambda snapshot_id, name, description: get_id( # pyright: ignore
VOLUME_SNAPSHOTS_LIST, snapshot_id # pyright: ignore
),
),
AutoSpecMethodInfo(
openstack_client.OpenstackClient.create_volume_snapshot,
return_value=lambda volume_id, name, description: random.choice( # pyright: ignore
returns=lambda volume_id, name, description: random.choice( # pyright: ignore
VOLUME_SNAPSHOTS_LIST,
),
),
AutoSpecMethodInfo(
openstack_client.OpenstackClient.create_volume_from_snapshot,
return_value=lambda snapshot_id, name, description: get_id( # pyright: ignore
returns=lambda snapshot_id, name, description: get_id( # pyright: ignore
VOLUMES_LIST, f'vid{len(VOLUMES_LIST) + 1}'
),
),
AutoSpecMethodInfo(
openstack_client.OpenstackClient.create_server_from_snapshot,
return_value=lambda *args, **kwargs: random.choice(SERVERS_LIST), # pyright: ignore
returns=lambda *args, **kwargs: random.choice(SERVERS_LIST), # pyright: ignore
),
AutoSpecMethodInfo(
openstack_client.OpenstackClient.test_connection,
return_value=True,
returns=True,
),
AutoSpecMethodInfo(
openstack_client.OpenstackClient.is_available,
return_value=True,
returns=True,
),
# connect returns None
# Test method
# AutoSpecMethodInfo(client.Client.list_projects, return_value=True),
# AutoSpecMethodInfo(client.Client.list_projects, returns=True),
# AutoSpecMethodInfo(
# client.ProxmoxClient.get_node_stats,
# return_value=lambda node, **kwargs: next(filter(lambda n: n.name == node, NODE_STATS)), # pyright: ignore
# returns=lambda node, **kwargs: next(filter(lambda n: n.name == node, NODE_STATS)), # pyright: ignore
# ),
]

View File

@ -159,52 +159,52 @@ CONSOLE_CONNECTION_INFO: types.services.ConsoleConnectionInfo = types.services.C
# without the need of a real OpenStack environment
# all methods that returns None are provided by the auto spec mock
CLIENT_METHODS_INFO: typing.Final[list[AutoSpecMethodInfo]] = [
AutoSpecMethodInfo(client.Client.test, return_value=True),
AutoSpecMethodInfo(client.Client.list_machines, return_value=VMS_INFO),
AutoSpecMethodInfo(client.Client.test, returns=True),
AutoSpecMethodInfo(client.Client.list_machines, returns=VMS_INFO),
AutoSpecMethodInfo(
client.Client.get_machine_info,
lambda machine_id, **kwargs: get_id(VMS_INFO, machine_id), # pyright: ignore
returns=lambda machine_id, **kwargs: get_id(VMS_INFO, machine_id), # pyright: ignore
),
AutoSpecMethodInfo(client.Client.list_clusters, return_value=CLUSTERS_INFO),
AutoSpecMethodInfo(client.Client.list_clusters, returns=CLUSTERS_INFO),
AutoSpecMethodInfo(
client.Client.get_cluster_info,
lambda cluster_id, **kwargs: get_id(CLUSTERS_INFO, cluster_id), # pyright: ignore
returns=lambda cluster_id, **kwargs: get_id(CLUSTERS_INFO, cluster_id), # pyright: ignore
),
AutoSpecMethodInfo(
client.Client.get_datacenter_info,
lambda datacenter_id, **kwargs: get_id( # pyright: ignore
returns=lambda datacenter_id, **kwargs: get_id( # pyright: ignore
DATACENTERS_INFO,
datacenter_id, # pyright: ignore
),
),
AutoSpecMethodInfo(
client.Client.get_storage_info,
lambda storage_id, **kwargs: get_id(STORAGES_INFO, storage_id), # pyright: ignore
returns=lambda storage_id, **kwargs: get_id(STORAGES_INFO, storage_id), # pyright: ignore
),
AutoSpecMethodInfo(
client.Client.create_template,
return_value=lambda *args, **kwargs: random.choice(TEMPLATES_INFO), # pyright: ignore
returns=lambda *args, **kwargs: random.choice(TEMPLATES_INFO), # pyright: ignore
),
AutoSpecMethodInfo(
client.Client.get_template_info,
lambda template_id, **kwargs: get_id(TEMPLATES_INFO, template_id), # pyright: ignore
returns=lambda template_id, **kwargs: get_id(TEMPLATES_INFO, template_id), # pyright: ignore
),
AutoSpecMethodInfo(
client.Client.deploy_from_template,
return_value=lambda *args, **kwargs: random.choice(VMS_INFO), # pyright: ignore
returns=lambda *args, **kwargs: random.choice(VMS_INFO), # pyright: ignore
),
AutoSpecMethodInfo(client.Client.list_snapshots, return_value=SNAPSHOTS_INFO),
AutoSpecMethodInfo(client.Client.list_snapshots, returns=SNAPSHOTS_INFO),
AutoSpecMethodInfo(
client.Client.get_snapshot_info,
return_value=lambda snapshot_id, **kwargs: get_id(SNAPSHOTS_INFO, snapshot_id), # pyright: ignore
returns=lambda snapshot_id, **kwargs: get_id(SNAPSHOTS_INFO, snapshot_id), # pyright: ignore
),
AutoSpecMethodInfo(
client.Client.get_console_connection_info,
return_value=CONSOLE_CONNECTION_INFO,
returns=CONSOLE_CONNECTION_INFO,
),
AutoSpecMethodInfo(
client.Client.create_snapshot,
return_value=lambda *args, **kwargs: random.choice(SNAPSHOTS_INFO), # pyright: ignore
returns=lambda *args, **kwargs: random.choice(SNAPSHOTS_INFO), # pyright: ignore
),
# connect returns None
# Test method
@ -218,7 +218,7 @@ CLIENT_METHODS_INFO: typing.Final[list[AutoSpecMethodInfo]] = [
PROVIDER_VALUES_DICT: typing.Final[gui.ValuesDictType] = {
'ovirt_version': '4',
'host': 'host.example.com',
'port': '443', # '443' is the default value
'port': 443, # '443' is the default value
'username': 'admin@ovirt@internalsso',
'password': 'the_testing_pass',
'concurrent_creation_limit': 33,
@ -254,11 +254,10 @@ def patch_provider_api(
**kwargs: typing.Any,
) -> typing.Generator[mock.Mock, None, None]:
client = create_client_mock()
try:
mock.patch('uds.services.OVirt.provider.OVirtProvider.api', returns=client).start()
# api is a property, patch it correctly
with mock.patch('uds.services.OVirt.provider.OVirtProvider.api', new_callable=mock.PropertyMock, **kwargs) as api:
api.return_value = client
yield client
finally:
mock.patch.stopall()
def create_provider(**kwargs: typing.Any) -> 'provider.OVirtProvider':

View File

@ -46,6 +46,7 @@ class TestOVirtProvider(UDSTransactionTestCase):
"""
provider = fixtures.create_provider() # Will not use client api, so no need to patch it
self.assertEqual(provider.ovirt_version.as_str(), fixtures.PROVIDER_VALUES_DICT['ovirt_version'])
self.assertEqual(provider.host.as_str(), fixtures.PROVIDER_VALUES_DICT['host'])
self.assertEqual(provider.port.as_int(), fixtures.PROVIDER_VALUES_DICT['port'])
self.assertEqual(provider.username.as_str(), fixtures.PROVIDER_VALUES_DICT['username'])
@ -106,7 +107,6 @@ class TestOVirtProvider(UDSTransactionTestCase):
def test_provider_is_available(self) -> None:
"""
Test the provider is_available
Thi is "specieal" because it uses cache
"""
with fixtures.patch_provider_api() as api:
provider = fixtures.create_provider()

View File

@ -271,88 +271,88 @@ CONSOLE_CONNECTION_INFO: typing.Final[types.services.ConsoleConnectionInfo] = (
CLIENT_METHODS_INFO: typing.Final[list[AutoSpecMethodInfo]] = [
# connect returns None
# Test method
AutoSpecMethodInfo(client.ProxmoxClient.test, return_value=True),
AutoSpecMethodInfo(client.ProxmoxClient.test, returns=True),
# get_cluster_info
AutoSpecMethodInfo(client.ProxmoxClient.get_cluster_info, return_value=CLUSTER_INFO),
AutoSpecMethodInfo(client.ProxmoxClient.get_cluster_info, returns=CLUSTER_INFO),
# get_next_vmid
AutoSpecMethodInfo(client.ProxmoxClient.get_next_vmid, return_value=1),
AutoSpecMethodInfo(client.ProxmoxClient.get_next_vmid, returns=1),
# is_vmid_available
AutoSpecMethodInfo(client.ProxmoxClient.is_vmid_available, return_value=True),
AutoSpecMethodInfo(client.ProxmoxClient.is_vmid_available, returns=True),
# get_node_networks, not called never (ensure it's not called by mistake)
# list_node_gpu_devices
AutoSpecMethodInfo(client.ProxmoxClient.list_node_gpu_devices, return_value=['gpu_dev_1', 'gpu_dev_2']),
AutoSpecMethodInfo(client.ProxmoxClient.list_node_gpu_devices, returns=['gpu_dev_1', 'gpu_dev_2']),
# list_node_vgpus
AutoSpecMethodInfo(client.ProxmoxClient.list_node_vgpus, return_value=VGPUS),
AutoSpecMethodInfo(client.ProxmoxClient.list_node_vgpus, returns=VGPUS),
# node_has_vgpus_available
AutoSpecMethodInfo(client.ProxmoxClient.node_has_vgpus_available, return_value=True),
AutoSpecMethodInfo(client.ProxmoxClient.node_has_vgpus_available, returns=True),
# get_best_node_for_machine
AutoSpecMethodInfo(client.ProxmoxClient.get_best_node_for_machine, return_value=NODE_STATS[0]),
AutoSpecMethodInfo(client.ProxmoxClient.get_best_node_for_machine, returns=NODE_STATS[0]),
# clone_machine
AutoSpecMethodInfo(client.ProxmoxClient.clone_machine, return_value=VM_CREATION_RESULT),
AutoSpecMethodInfo(client.ProxmoxClient.clone_machine, returns=VM_CREATION_RESULT),
# list_ha_groups
AutoSpecMethodInfo(client.ProxmoxClient.list_ha_groups, return_value=HA_GROUPS),
AutoSpecMethodInfo(client.ProxmoxClient.list_ha_groups, returns=HA_GROUPS),
# enable_machine_ha return None
# disable_machine_ha return None
# set_protection return None
# get_guest_ip_address
AutoSpecMethodInfo(client.ProxmoxClient.get_guest_ip_address, return_value=GUEST_IP_ADDRESS),
AutoSpecMethodInfo(client.ProxmoxClient.get_guest_ip_address, returns=GUEST_IP_ADDRESS),
# remove_machine
AutoSpecMethodInfo(client.ProxmoxClient.remove_machine, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.remove_machine, returns=UPID),
# list_snapshots
AutoSpecMethodInfo(client.ProxmoxClient.list_snapshots, return_value=SNAPSHOTS_INFO),
AutoSpecMethodInfo(client.ProxmoxClient.list_snapshots, returns=SNAPSHOTS_INFO),
# supports_snapshot
AutoSpecMethodInfo(client.ProxmoxClient.supports_snapshot, return_value=True),
AutoSpecMethodInfo(client.ProxmoxClient.supports_snapshot, returns=True),
# create_snapshot
AutoSpecMethodInfo(client.ProxmoxClient.create_snapshot, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.create_snapshot, returns=UPID),
# remove_snapshot
AutoSpecMethodInfo(client.ProxmoxClient.remove_snapshot, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.remove_snapshot, returns=UPID),
# restore_snapshot
AutoSpecMethodInfo(client.ProxmoxClient.restore_snapshot, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.restore_snapshot, returns=UPID),
# get_task
AutoSpecMethodInfo(client.ProxmoxClient.get_task, return_value=TASK_STATUS),
AutoSpecMethodInfo(client.ProxmoxClient.get_task, returns=TASK_STATUS),
# list_machines
AutoSpecMethodInfo(client.ProxmoxClient.list_machines, return_value=VMS_INFO),
AutoSpecMethodInfo(client.ProxmoxClient.list_machines, returns=VMS_INFO),
# get_machine_pool_info
AutoSpecMethodInfo(
client.ProxmoxClient.get_machine_pool_info,
return_value=lambda vmid, poolid, **kwargs: VMS_INFO[vmid - 1], # pyright: ignore
returns=lambda vmid, poolid, **kwargs: VMS_INFO[vmid - 1], # pyright: ignore
),
# get_machine_info
AutoSpecMethodInfo(
client.ProxmoxClient.get_machine_info,
return_value=lambda vmid, *args, **kwargs: VMS_INFO[vmid - 1], # pyright: ignore
returns=lambda vmid, *args, **kwargs: VMS_INFO[vmid - 1], # pyright: ignore
),
# get_machine_configuration
AutoSpecMethodInfo(
client.ProxmoxClient.get_machine_configuration,
return_value=lambda vmid, **kwargs: VMS_CONFIGURATION[vmid - 1], # pyright: ignore
returns=lambda vmid, **kwargs: VMS_CONFIGURATION[vmid - 1], # pyright: ignore
),
# enable_machine_ha return None
# start_machine
AutoSpecMethodInfo(client.ProxmoxClient.start_machine, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.start_machine, returns=UPID),
# stop_machine
AutoSpecMethodInfo(client.ProxmoxClient.stop_machine, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.stop_machine, returns=UPID),
# reset_machine
AutoSpecMethodInfo(client.ProxmoxClient.reset_machine, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.reset_machine, returns=UPID),
# suspend_machine
AutoSpecMethodInfo(client.ProxmoxClient.suspend_machine, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.suspend_machine, returns=UPID),
# resume_machine
AutoSpecMethodInfo(client.ProxmoxClient.resume_machine, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.resume_machine, returns=UPID),
# shutdown_machine
AutoSpecMethodInfo(client.ProxmoxClient.shutdown_machine, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.shutdown_machine, returns=UPID),
# convert_to_template
AutoSpecMethodInfo(client.ProxmoxClient.convert_to_template, return_value=UPID),
AutoSpecMethodInfo(client.ProxmoxClient.convert_to_template, returns=UPID),
# get_storage
AutoSpecMethodInfo(
client.ProxmoxClient.get_storage,
return_value=lambda storage, node, **kwargs: next( # pyright: ignore
returns=lambda storage, node, **kwargs: next( # pyright: ignore
filter(lambda s: s.storage == storage, STORAGES) # pyright: ignore
), # pyright: ignore
),
# list_storages
AutoSpecMethodInfo(
client.ProxmoxClient.list_storages,
return_value=lambda node, **kwargs: ( # pyright: ignore
returns=lambda node, **kwargs: ( # pyright: ignore
(list(filter(lambda s: s.node == node, STORAGES))) # pyright: ignore
if node is not None
else STORAGES # pyright: ignore
@ -361,23 +361,23 @@ CLIENT_METHODS_INFO: typing.Final[list[AutoSpecMethodInfo]] = [
# get_node_stats
AutoSpecMethodInfo(
client.ProxmoxClient.get_node_stats,
return_value=lambda node, **kwargs: next( # pyright: ignore
returns=lambda node, **kwargs: next( # pyright: ignore
filter(lambda n: n.name == node, NODE_STATS) # pyright: ignore
),
),
# list_pools
AutoSpecMethodInfo(client.ProxmoxClient.list_pools, return_value=POOLS),
AutoSpecMethodInfo(client.ProxmoxClient.list_pools, returns=POOLS),
# get_pool_info
AutoSpecMethodInfo(
client.ProxmoxClient.get_pool_info,
return_value=lambda poolid, **kwargs: next( # pyright: ignore
returns=lambda poolid, **kwargs: next( # pyright: ignore
filter(lambda p: p.poolid == poolid, POOLS) # pyright: ignore
),
),
# get_console_connection
AutoSpecMethodInfo(client.ProxmoxClient.get_console_connection, return_value=CONSOLE_CONNECTION_INFO),
AutoSpecMethodInfo(client.ProxmoxClient.get_console_connection, returns=CONSOLE_CONNECTION_INFO),
# journal
AutoSpecMethodInfo(client.ProxmoxClient.journal, return_value=['journal line 1', 'journal line 2']),
AutoSpecMethodInfo(client.ProxmoxClient.journal, returns=['journal line 1', 'journal line 2']),
]
PROVIDER_VALUES_DICT: typing.Final[gui.ValuesDictType] = {

View File

@ -36,7 +36,7 @@ from unittest import mock
@dataclasses.dataclass
class AutoSpecMethodInfo:
name: str|typing.Callable[..., typing.Any]
return_value: typing.Any = None # Can be a callable or a value
returns: typing.Any = None # Can be a callable or a value
def autospec(cls: type, metods_info: collections.abc.Iterable[AutoSpecMethodInfo], **kwargs: typing.Any) -> mock.Mock:
@ -54,9 +54,9 @@ def autospec(cls: type, metods_info: collections.abc.Iterable[AutoSpecMethodInfo
# Set the return value for the method or the side_effect
name = method_info.name if isinstance(method_info.name, str) else method_info.name.__name__
mck = getattr(obj, name)
if callable(method_info.return_value):
mck.side_effect = method_info.return_value
if callable(method_info.returns):
mck.side_effect = method_info.returns
else:
mck.return_value = method_info.return_value
mck.return_value = method_info.returns
return obj