Skip to content

Commit

Permalink
Add unit tests for Coriolis Scheduler RPC Server
Browse files Browse the repository at this point in the history
  • Loading branch information
Sergiu Miclea committed May 1, 2023
1 parent 1a06a34 commit f3a39b9
Show file tree
Hide file tree
Showing 5 changed files with 430 additions and 0 deletions.
Empty file.
Empty file.
320 changes: 320 additions & 0 deletions coriolis/tests/scheduler/rpc/data/get_workers_for_specs_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,320 @@
## ENABLED TESTS ##

# no filters, but services available
- config:
services_db:
- id: 1
topic: coriolis_worker
- id: 2
topic: coriolis_scheduler
- id: 3
topic: coriolis_worker
expected_result: [1, 3]
expected_exception: ~

# no services
- config:
enabled: true
expected_result: ~
expected_exception: NoWorkerServiceError

# no worker services
- config:
enabled: true
services_db:
- topic: coriolis_scheduler
expected_result: ~
expected_exception: NoWorkerServiceError

# no enabled services
- config:
enabled: true
services_db:
- topic: coriolis_worker
- topic: coriolis_scheduler
expected_result: ~
expected_exception: NoSuitableWorkerServiceError

# no enabled services with enabled set to false
- config:
enabled: true
services_db:
- topic: coriolis_worker
enabled: false
- topic: coriolis_scheduler
expected_result: ~
expected_exception: NoSuitableWorkerServiceError

# different topic and enabled combinations
- config:
enabled: true
services_db:
- id: 1
topic: coriolis_worker
enabled: true
- id: 2
topic: coriolis_worker
enabled: false
- id: 3
topic: coriolis_worker
enabled: true
- id: 4
topic: coriolis_scheduler
enabled: true
expected_result: [1, 3]
expected_exception: ~

## REGIONS TESTS ##

- config:
region_sets: [[region_1, region_2], [region_3]]
regions_db:
- id: region_1
enabled: true
- id: region_2
enabled: false
- id: region_3
enabled: true
services_db:
- id: 1
topic: coriolis_worker
mapped_regions:
- id: region_1
- id: region_3
- id: 2
topic: coriolis_worker
mapped_regions:
- id: region_2
- id: region_3
# region_3 not mapped
- id: 3
topic: coriolis_worker
mapped_regions:
- id: region_2
- id: 4
topic: coriolis_worker
mapped_regions:
- id: region_1
- id: region_2
- id: region_3
- id: 5
topic: coriolis_worker
mapped_regions:
- id: invalid_region
expected_result: [1, 2, 4]
expected_exception: ~

# region_3 is disabled in DB
- config:
region_sets: [[region_1, region_2], [region_3]]
regions_db:
- id: region_1
enabled: true
- id: region_2
enabled: false
- id: region_3
enabled: false
services_db:
- id: 1
topic: coriolis_worker
mapped_regions:
- id: region_1
- id: region_3
- id: 2
topic: coriolis_worker
mapped_regions:
- id: region_2
- id: region_3
- id: 3
topic: coriolis_worker
mapped_regions:
- id: region_2
- id: 4
topic: coriolis_worker
mapped_regions:
- id: region_1
- id: region_2
- id: region_3
- id: 5
topic: coriolis_worker
mapped_regions:
- id: invalid_region
expected_result: ~
expected_exception: NoSuitableRegionError

# region_4 is not in DB
- config:
region_sets: [[region_1, region_2], [region_3, region_4]]
regions_db:
- id: region_1
enabled: true
- id: region_2
enabled: false
- id: region_3
enabled: true
services_db:
- id: 1
topic: coriolis_worker
mapped_regions:
- id: region_1
- id: region_3
- id: 2
topic: coriolis_worker
mapped_regions:
- id: region_2
- id: region_3
- id: 3
topic: coriolis_worker
mapped_regions:
- id: region_2
- id: 4
topic: coriolis_worker
mapped_regions:
- id: region_1
- id: region_2
- id: region_3
- id: 5
topic: coriolis_worker
mapped_regions:
- id: invalid_region
expected_result: ~
expected_exception: RegionNotFound

## PROVIDERS TESTS ##

- config:
provider_requirements:
provider_1: [1, 2, 16]
provider_2: [1, 2]
provider_3: [1, 32]
services_db:
- id: 1
topic: coriolis_worker
providers:
provider_1:
types: [1, 2, 16]
provider_2:
types: [1, 2, 16]
provider_3:
types: [1, 2, 16, 32]
# 2 is missing provider_3 with 32
- id: 2
topic: coriolis_worker
providers:
provider_1:
types: [1, 2, 16]
provider_2:
types: [1, 2, 16]
provider_3:
types: [1, 2, 16]
- id: 3
topic: coriolis_worker
providers:
provider_1:
types: [1, 2, 16, 32]
provider_2:
types: [1, 2, 16, 32]
provider_3:
types: [1, 2, 16, 32, 64]
expected_result: [1, 3]
expected_exception: ~

## ALL TOGETHER: ENABLED, REGIONS AND PROVIDER ##

- config:
enabled: true
region_sets: [[region_1, region_2], [region_3]]
provider_requirements:
provider_1: [1, 2, 16]
provider_2: [1, 2]
provider_3: [1, 32]
regions_db:
- id: region_1
enabled: true
- id: region_2
enabled: false
- id: region_3
enabled: true
services_db:
- id: 1
topic: coriolis_worker
enabled: true
mapped_regions:
- id: region_1
- id: region_3
providers:
provider_1:
types: [1, 2, 16]
provider_2:
types: [1, 2, 16]
provider_3:
types: [1, 2, 16, 32]
# 2 is missing provider_3 with 32
- id: 2
topic: coriolis_worker
enabled: true
mapped_regions:
- id: region_2
- id: region_3
providers:
provider_1:
types: [1, 2, 16]
provider_2:
types: [1, 2, 16]
provider_3:
types: [1, 2, 16]
- id: 3
topic: coriolis_worker
enabled: true
mapped_regions:
- id: region_1
- id: region_2
- id: region_3
providers:
provider_1:
types: [1, 2, 16, 32]
provider_2:
types: [1, 2, 16, 32]
provider_3:
types: [1, 2, 16, 32, 64]
- id: 4
topic: coriolis_worker
enabled: true
# missing region_1 or region_2
mapped_regions:
- id: region_3
providers:
provider_1:
types: [1, 2, 16, 32]
provider_2:
types: [1, 2, 16, 32]
provider_3:
types: [1, 2, 16, 32, 64]
- id: 5
topic: coriolis_worker
enabled: true
mapped_regions:
- id: region_1
- id: region_3
providers:
provider_1:
types: [1, 2, 16, 32]
provider_2:
types: [1, 2, 16, 32]
provider_3:
types: [1, 2, 16, 32, 64]
- id: 6
topic: coriolis_worker
# is not enabled
mapped_regions:
- id: region_1
- id: region_3
providers:
provider_1:
types: [1, 2, 16, 32]
provider_2:
types: [1, 2, 16, 32]
provider_3:
types: [1, 2, 16, 32, 64]
expected_result: [1, 3, 5]
expected_exception: ~
77 changes: 77 additions & 0 deletions coriolis/tests/scheduler/rpc/test_server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Copyright 2023 Cloudbase Solutions Srl
# All Rights Reserved.

from unittest import mock

import ddt


from coriolis import exception
from coriolis.db import api as db_api
from coriolis.tests import test_base, testutils
from coriolis.scheduler.rpc import server


@ddt.ddt
class SchedulerServerEndpointTestCase(test_base.CoriolisBaseTestCase):
"""Test suite for the Coriolis Scheduler Worker RPC server."""

def setUp(self):
super(SchedulerServerEndpointTestCase, self).setUp()
self.server = server.SchedulerServerEndpoint()

@mock.patch.object(db_api, "get_regions")
@mock.patch.object(db_api, "get_services")
@ddt.file_data("data/get_workers_for_specs_config.yaml")
@ddt.unpack
def test_get_workers_for_specs(
self,
mock_get_services,
mock_get_regions,
config,
expected_result,
expected_exception,
):

enabled = config.get("enabled", None)
region_sets = config.get("region_sets", None)
provider_requirements = config.get("provider_requirements", None)

# Convert the config dict to an object, skipping the providers
# providers is the only field used as dict in the code
config_obj = testutils.DictToObject(config, skip_attrs=["providers"])
mock_get_services.return_value = config_obj.services_db or []
mock_get_regions.return_value = config_obj.regions_db or []

if expected_exception:
exception_mapping = {
"NoWorkerServiceError": exception
.NoWorkerServiceError,
"NoSuitableWorkerServiceError": exception
.NoSuitableWorkerServiceError,
"NoSuitableRegionError": exception
.NoSuitableRegionError,
"RegionNotFound": exception
.RegionNotFound,
}
exception_type = exception_mapping.get(expected_exception)
self.assertRaises(
exception_type,
self.server.get_workers_for_specs,
mock.sentinel.context,
enabled=enabled,
region_sets=region_sets,
provider_requirements=provider_requirements,
)
return

result = self.server.get_workers_for_specs(
mock.sentinel.context,
enabled=enabled,
region_sets=region_sets,
provider_requirements=provider_requirements,
)

id_array = [worker.id for worker in result]

self.assertEqual(id_array, expected_result)
Loading

0 comments on commit f3a39b9

Please sign in to comment.