
- scheduler_manager: - added support to trusted token and shared quota - implemented backfill strategy - fairshare_manager: various rewrites and fixes - nova_manager: - added support to user-data (metadata) - new implementation of getProjectUsage() and getProjectServers() - quota_manager: added support to shared quota - queue_manager: few stylistic changes - command: shell conforming to the OS style - setup.cfg: entry points updated - added functional tests Sem-Ver: feature Change-Id: Ib0568d7b3497e3a3534c67130fe31c6527faff68
148 lines
5.5 KiB
Python
Executable File
148 lines
5.5 KiB
Python
Executable File
# 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.common.project import Project
|
|
from synergy_scheduler_manager.common.user import User
|
|
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):
|
|
project = Project()
|
|
project.setId(1)
|
|
project.setName("test_project")
|
|
prj_share = project.getShare()
|
|
prj_share.setValue(5)
|
|
self.fsmanager.addProject(project)
|
|
|
|
self.assertEqual(1, self.fsmanager.projects[1].getId())
|
|
self.assertEqual("test_project", self.fsmanager.projects[1].getName())
|
|
self.assertEqual([], self.fsmanager.projects[1].getUsers())
|
|
self.assertEqual(5, self.fsmanager.projects[1].getShare().getValue())
|
|
|
|
def test_add_project_no_share(self):
|
|
project = Project()
|
|
project.setId(1)
|
|
project.setName("test_project")
|
|
self.fsmanager.addProject(project)
|
|
|
|
self.assertEqual(1, self.fsmanager.projects[1].getId())
|
|
self.assertEqual("test_project", self.fsmanager.projects[1].getName())
|
|
self.assertEqual([], self.fsmanager.projects[1].getUsers())
|
|
self.assertEqual(self.fsmanager.default_share,
|
|
self.fsmanager.projects[1].getShare().getValue())
|
|
|
|
def test_get_project(self):
|
|
project = Project()
|
|
project.setId(1)
|
|
project.setName("test_project")
|
|
self.fsmanager.addProject(project)
|
|
|
|
self.assertEqual(project, self.fsmanager.getProject(1))
|
|
|
|
def test_get_projects(self):
|
|
project1 = Project()
|
|
project1.setId(1)
|
|
project1.setName("test1")
|
|
self.fsmanager.addProject(project1)
|
|
|
|
project2 = Project()
|
|
project2.setId(2)
|
|
project2.setName("test2")
|
|
self.fsmanager.addProject(project2)
|
|
|
|
expected_projects = {
|
|
1: project1,
|
|
2: project2}
|
|
self.assertEqual(expected_projects, self.fsmanager.getProjects())
|
|
|
|
def test_remove_project(self):
|
|
project = Project()
|
|
project.setId(1)
|
|
project.setName("test_project")
|
|
self.fsmanager.addProject(project)
|
|
|
|
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")
|
|
project = Project()
|
|
project.setId(1)
|
|
project.setName("test_project")
|
|
|
|
# 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
|
|
user = User()
|
|
user.setId(22)
|
|
user.setName("test_user")
|
|
priority = user.getPriority()
|
|
priority.setFairShare('vcpus', fairshare_cores)
|
|
priority.setFairShare('memory', fairshare_ram)
|
|
|
|
project.addUser(user)
|
|
self.fsmanager.addProject(project)
|
|
|
|
# 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=22, prj_id=1)
|
|
|
|
self.assertEqual(expected_priority, priority)
|
|
|
|
def test_calculate_fairshare(self):
|
|
# TODO(vincent)
|
|
pass
|