Пример #1
0
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()
Пример #2
0
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))