
In this commit we add several unit tests that covers some managers. We chose to write unit tests for managers that are closest to Synergy core functionalities in a first stage. Also, we test only method specific to each manager as the base methods of Manager class have been tested in Synergy. Managers with unit tests: - FairShareManager - QueueManager - QuotaManager (and DynamicQuota) - SchedulerManager Change-Id: I831649e48b36bbaf94f6790fbf1a8954636fac32
138 lines
5.5 KiB
Python
138 lines
5.5 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from datetime import datetime
|
|
|
|
from mock import MagicMock
|
|
from mock import patch
|
|
|
|
from synergy_scheduler_manager.fairshare_manager import FairShareManager
|
|
from synergy_scheduler_manager.keystone_manager import KeystoneManager
|
|
from synergy_scheduler_manager.queue_manager import QueueManager
|
|
from synergy_scheduler_manager.quota_manager import QuotaManager
|
|
from synergy_scheduler_manager.tests.unit import base
|
|
|
|
|
|
class TestFairshareManager(base.TestCase):
|
|
|
|
def setUp(self):
|
|
super(TestFairshareManager, self).setUp()
|
|
self.fsmanager = FairShareManager()
|
|
|
|
# NOTE(vincent): we cannot import NovaManager in our tests.
|
|
# NovaManager depends on the "nova" package (not novaclient), but it is
|
|
# not available on PyPI so the test runner will fail to install it.
|
|
nova_manager_mock = MagicMock()
|
|
|
|
self.fsmanager.managers = {
|
|
'NovaManager': nova_manager_mock(),
|
|
'QueueManager': QueueManager(),
|
|
'QuotaManager': QuotaManager(),
|
|
'KeystoneManager': KeystoneManager()}
|
|
|
|
# Mock the configuration since it is initiliazed by synergy-service.
|
|
with patch('synergy_scheduler_manager.fairshare_manager.CONF'):
|
|
self.fsmanager.setup()
|
|
|
|
def test_add_project(self):
|
|
self.fsmanager.addProject(prj_id=1, prj_name="test_project", share=5)
|
|
|
|
self.assertEqual(1, self.fsmanager.projects[1]["id"])
|
|
self.assertEqual("test_project", self.fsmanager.projects[1]["name"])
|
|
self.assertEqual("dynamic", self.fsmanager.projects[1]["type"])
|
|
self.assertEqual({}, self.fsmanager.projects[1]["users"])
|
|
self.assertEqual({}, self.fsmanager.projects[1]["usage"])
|
|
self.assertEqual(5, self.fsmanager.projects[1]["share"])
|
|
|
|
def test_add_project_no_share(self):
|
|
self.fsmanager.addProject(prj_id=1, prj_name="test_project")
|
|
|
|
self.assertEqual(1, self.fsmanager.projects[1]["id"])
|
|
self.assertEqual("test_project", self.fsmanager.projects[1]["name"])
|
|
self.assertEqual("dynamic", self.fsmanager.projects[1]["type"])
|
|
self.assertEqual({}, self.fsmanager.projects[1]["users"])
|
|
self.assertEqual({}, self.fsmanager.projects[1]["usage"])
|
|
self.assertEqual(self.fsmanager.default_share,
|
|
self.fsmanager.projects[1]["share"])
|
|
|
|
def test_get_project(self):
|
|
self.fsmanager.addProject(prj_id=1, prj_name="test_project")
|
|
|
|
expected_project = {
|
|
"id": 1,
|
|
"name": "test_project",
|
|
"type": "dynamic",
|
|
"users": {},
|
|
"usage": {},
|
|
"share": self.fsmanager.default_share}
|
|
self.assertEqual(expected_project, self.fsmanager.getProject(1))
|
|
|
|
def test_get_projects(self):
|
|
self.fsmanager.addProject(prj_id=1, prj_name="test1")
|
|
self.fsmanager.addProject(prj_id=2, prj_name="test2")
|
|
|
|
expected_projects = {
|
|
1: {"id": 1,
|
|
"name": "test1",
|
|
"type": "dynamic",
|
|
"users": {},
|
|
"usage": {},
|
|
"share": self.fsmanager.default_share},
|
|
2: {"id": 2,
|
|
"name": "test2",
|
|
"type": "dynamic",
|
|
"users": {},
|
|
"usage": {},
|
|
"share": self.fsmanager.default_share}}
|
|
self.assertEqual(expected_projects, self.fsmanager.getProjects())
|
|
|
|
def test_remove_project(self):
|
|
self.fsmanager.addProject(prj_id=1, prj_name="test")
|
|
|
|
self.assertIn(1, self.fsmanager.projects)
|
|
self.fsmanager.removeProject(1)
|
|
self.assertNotIn(1, self.fsmanager.projects)
|
|
|
|
def test_calculate_priority_one_user(self):
|
|
self.fsmanager.addProject(prj_id=1, prj_name="test")
|
|
|
|
# Define values used for computing the priority
|
|
age_weight = self.fsmanager.age_weight = 1.0
|
|
vcpus_weight = self.fsmanager.vcpus_weight = 2.0
|
|
memory_weight = self.fsmanager.memory_weight = 3.0
|
|
datetime_start = datetime(year=2000, month=1, day=1, hour=0, minute=0)
|
|
datetime_stop = datetime(year=2000, month=1, day=1, hour=2, minute=0)
|
|
minutes = (datetime_stop - datetime_start).seconds / 60
|
|
fairshare_cores = 10
|
|
fairshare_ram = 50
|
|
|
|
# Add a user to the project
|
|
self.fsmanager.projects[1]["users"] = {
|
|
1: {"fairshare_cores": fairshare_cores,
|
|
"fairshare_ram": fairshare_ram}}
|
|
|
|
# Compute the expected priority given the previously defined values
|
|
expected_priority = int(age_weight * minutes +
|
|
vcpus_weight * fairshare_cores +
|
|
memory_weight * fairshare_ram)
|
|
|
|
with patch("synergy_scheduler_manager.fairshare_manager.datetime") \
|
|
as datetime_mock:
|
|
datetime_mock.utcnow.side_effect = (datetime_start, datetime_stop)
|
|
priority = self.fsmanager.calculatePriority(user_id=1, prj_id=1)
|
|
|
|
self.assertEqual(expected_priority, priority)
|
|
|
|
def test_calculate_fairshare(self):
|
|
# TODO(vincent)
|
|
pass
|