class Vmmaster(Flask): def __init__(self, *args, **kwargs): from core.db import Database from core.sessions import Sessions from vmpool.virtual_machines_pool import VirtualMachinesPool super(Vmmaster, self).__init__(*args, **kwargs) self.running = True self.uuid = str(uuid1()) self.database = Database() self.pool = VirtualMachinesPool(self) self.sessions = Sessions(self) self.json_encoder = JSONEncoder self.register() def register(self): self.database.register_platforms(self.uuid, self.pool.platforms.info()) def unregister(self): self.database.unregister_platforms(self.uuid) def cleanup(self): log.info("Shutting down...") self.pool.stop_workers() self.sessions.worker.stop() self.pool.free() self.unregister() self.pool.platforms.cleanup() log.info("Server gracefully shut down.")
class TestVirtualMachinePool(BaseTestCase): def setUp(self): setup_config('data/config.py') self.platform = "test_origin_1" with patch('core.connection.Virsh', Mock()), patch('core.network.Network', Mock()): from vmpool.virtual_machines_pool import VirtualMachinesPool self.pool = VirtualMachinesPool() def tearDown(self): with patch('core.utils.delete_file', Mock()): self.pool.free() def test_pool_count(self): self.assertEqual(0, self.pool.count()) self.pool.add(self.platform) self.assertEqual(1, self.pool.count()) def test_get_parallel_two_vm(self): from multiprocessing.pool import ThreadPool threads = ThreadPool(processes=1) self.pool.preload(self.platform) self.pool.preload(self.platform) self.assertEqual(2, len(self.pool.pool)) deffered1 = threads.apply_async(self.pool.get_by_platform, args=(self.platform, )) deffered2 = threads.apply_async(self.pool.get_by_platform, args=(self.platform, )) deffered1.wait() deffered2.wait() self.assertEqual(2, len(self.pool.using)) def test_vm_preloading(self): self.assertEqual(0, len(self.pool.pool)) self.pool.preload(self.platform) from vmpool import VirtualMachine self.assertIsInstance(self.pool.pool[0], VirtualMachine) self.assertEqual(1, len(self.pool.pool)) def test_vm_adding(self): self.assertEqual(0, len(self.pool.pool)) self.pool.add(self.platform) from vmpool import VirtualMachine self.assertIsInstance(self.pool.using[0], VirtualMachine) self.assertEqual(1, len(self.pool.using)) def test_vm_deletion(self): self.assertEqual(0, len(self.pool.pool)) self.pool.preload(self.platform) self.assertEqual(1, len(self.pool.pool)) vm = self.pool.get_by_platform(self.platform) with patch('core.utils.delete_file', Mock()): vm.delete() self.assertEqual(0, self.pool.count()) def test_max_vm_count(self): config.KVM_MAX_VM_COUNT = 2 self.pool.add(self.platform) self.pool.add(self.platform) self.assertIsNone(self.pool.add(self.platform)) def test_platform_from_config(self): desired_caps = {'desiredCapabilities': {'platform': "test_origin_1"}} config.PLATFORM = "test_origin_2" self.app = Flask(__name__) self.app.pool = self.pool self.ctx = self.app.app_context() self.ctx.push() from vmpool.endpoint import get_vm for vm in get_vm(desired_caps): self.assertEqual(vm.platform, config.PLATFORM) break self.ctx.pop()