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()
class TestVirtualMachinePool(BaseTestCase): def setUp(self): from core.db import Database setup_config('data/config.py') self.platform_name = "origin_1" self.app = Flask(__name__) self.ctx = self.app.app_context() self.ctx.push() self.app.database = Database() self.app.sessions = Mock() self.mocked_image = Mock( id=1, status='active', get=Mock(return_value='snapshot'), min_disk=20, min_ram=2, instance_type_flavorid=1, ) type(self.mocked_image).name = PropertyMock( return_value='test_origin_1') with patch.multiple( 'vmpool.platforms.OpenstackPlatforms', images=Mock(return_value=[self.mocked_image]), flavor_params=Mock(return_value={ 'vcpus': 1, 'ram': 2 }), limits=Mock( return_value={ 'maxTotalCores': 10, 'maxTotalInstances': 10, 'maxTotalRAMSize': 100, 'totalCoresUsed': 0, 'totalInstancesUsed': 0, 'totalRAMUsed': 0 }), ): from vmpool.virtual_machines_pool import VirtualMachinesPool self.pool = VirtualMachinesPool(self.app, preloader_class=Mock(), artifact_collector_class=Mock(), endpoint_preparer_class=Mock()) self.ctx = self.app.app_context() self.ctx.push() self.pool.register() def tearDown(self): self.pool.endpoint_remover.remove_all() self.pool.unregister() self.pool.platforms.cleanup() self.ctx.pop() def test_run_workers(self): self.pool.endpoint_remover.start = Mock() self.pool.start_workers() self.assertTrue(self.pool.endpoint_preparer.start.called) self.assertTrue(self.pool.endpoint_remover.start.called) self.assertTrue(self.pool.preloader.start.called) def test_stop_workers(self): self.pool.endpoint_remover.stop = Mock() self.pool.stop_workers() self.assertTrue(self.pool.endpoint_preparer.stop.called) self.assertTrue(self.pool.endpoint_remover.stop.called) self.assertTrue(self.pool.artifact_collector.stop.called) self.assertTrue(self.pool.preloader.stop.called) def test_pool_count(self): self.assertEqual(0, len(self.pool.active_endpoints)) self.pool.add(self.platform_name) self.assertEqual(1, len(self.pool.active_endpoints)) def test_get_parallel_two_vm(self): from multiprocessing.pool import ThreadPool threads = ThreadPool(processes=1) self.pool.preload(self.platform_name) self.pool.preload(self.platform_name) self.assertEqual(2, len(self.pool.active_endpoints)) deffered1 = threads.apply_async(self.pool.get_by_platform, args=(self.platform_name, )) deffered2 = threads.apply_async(self.pool.get_by_platform, args=(self.platform_name, )) deffered1.wait() deffered2.wait() self.assertEqual(2, len(self.pool.active_endpoints)) def test_vm_preloading(self): self.assertEqual(0, len(self.pool.active_endpoints)) self.pool.preload(self.platform_name) from core.db.models import OpenstackClone self.assertIsInstance(self.pool.active_endpoints[0], OpenstackClone) self.assertEqual(1, len(self.pool.active_endpoints)) def test_vm_adding(self): self.assertEqual(0, len(self.pool.active_endpoints)) self.pool.add(self.platform_name) from core.db.models import OpenstackClone self.assertIsInstance(self.pool.active_endpoints[0], OpenstackClone) self.assertEqual(1, len(self.pool.active_endpoints)) def test_vm_deletion(self): self.assertEqual(0, len(self.pool.active_endpoints)) clone = self.pool.preload(self.platform_name) self.assertEqual(1, len(self.pool.active_endpoints)) clone.delete() self.app.database.delete(clone) self.assertEqual(0, len(self.pool.active_endpoints)) def test_max_vm_count(self): config.OPENSTACK_MAX_VM_COUNT = 2 self.pool.add(self.platform_name) self.pool.add(self.platform_name) self.assertIsNone(self.pool.add(self.platform_name)) def test_got_ondemand_vm_if_got_env_vars(self): dc = {"environmentVars": {"TEST_ENV2": 0}} self.assertEqual(0, len(self.pool.active_endpoints)) self.pool.preload(self.platform_name) self.assertEqual(1, len(self.pool.active_endpoints)) vm = self.pool.get_vm(self.platform_name, dc=json.dumps(dc)) self.assertTrue(vm.is_ondemand()) self.assertDictEqual(vm.environment_variables, {u"TEST_ENV2": 0}) self.assertEqual(2, len(self.pool.active_endpoints)) def test_got_preloaded_vm_if_env_vars_is_None(self): dc = {"desiredCapabilities": {}} self.assertEqual(0, len(self.pool.active_endpoints)) self.pool.preload(self.platform_name) self.assertEqual(1, len(self.pool.active_endpoints)) vm = self.pool.get_vm(self.platform_name, dc=json.dumps(dc)) self.assertTrue(vm.is_preloaded()) self.assertEqual(1, len(self.pool.active_endpoints))