def test_get_queued_resources_with_no_resources(self): """Tests successfully getting queued resource information when all cluster resources is empty.""" resource_mgr.refresh_agent_resources([], now()) resource_db = ClusterResources.objects.first() self.assertIsNone(resource_db) resource_mgr.update_all_cluster_resources() resource_db = ClusterResources.objects.first() self.assertIsNone(resource_db) queued_resources = resource_mgr.get_queued_resources() self.assertDictEqual( queued_resources, { "cluster_resources": {}, "queue_lengths": { 'PENDING': 0, 'QUEUED': 3, 'RUNNING': 0 }, "total_resources": { 'PENDING': {}, 'QUEUED': { 'cpus': 3.0, 'mem': 384.0 }, 'RUNNING': {} } })
def test_max_resources(self): """Tests successfully calculating the max resources in a cluster""" offer_1 = ResourceOffer( 'offer_1', self.agent_1.agent_id, self.framework_id, NodeResources([Cpus(2.0), Mem(22048.0), Disk(1024.0)]), now(), None) offer_2 = ResourceOffer( 'offer_2', self.agent_2.agent_id, self.framework_id, NodeResources([Cpus(25.0), Mem(2048.0), Disk(2048.0)]), now(), None) offer_3 = ResourceOffer( 'offer_3', self.agent_2.agent_id, self.framework_id, NodeResources([Cpus(225.0), Mem(1024.0), Disk(22048.0)]), now(), None) resource_mgr.add_new_offers([offer_1, offer_2, offer_3]) resource_mgr.refresh_agent_resources([], now()) max = resource_mgr.get_max_available_resources() self.assertTrue( max.is_equal( NodeResources([Cpus(250.0), Mem(22048.0), Disk(24096.0)])))
def test_update_all_cluster_resources(self): """Tests successfully updating the all cluster resources database in a cluster""" offer_1 = ResourceOffer( 'offer_1', self.agent_1.agent_id, self.framework_id, NodeResources([Cpus(2.0), Mem(22048.0), Disk(1024.0)]), now(), None) offer_2 = ResourceOffer( 'offer_2', self.agent_2.agent_id, self.framework_id, NodeResources([Cpus(25.0), Mem(2048.0), Disk(2048.0)]), now(), None) offer_3 = ResourceOffer( 'offer_3', self.agent_2.agent_id, self.framework_id, NodeResources([Cpus(225.0), Mem(1024.0), Disk(22048.0)]), now(), None) resource_mgr.add_new_offers([offer_1, offer_2, offer_3]) resource_mgr.refresh_agent_resources([], now()) resource_db = ClusterResources.objects.first() self.assertIsNone(resource_db) resource_mgr.update_all_cluster_resources() resource_db = ClusterResources.objects.first() self.assertIsNotNone(resource_db) self.assertEqual(resource_db.mem, 25120.0) self.assertEqual(resource_db.gpus, 0.0) self.assertEqual(resource_db.disk, 25120.0) self.assertEqual(resource_db.cpus, 252.0)
def test_all_available_resources(self): """Tests successfully calculating the available resources in a cluster""" offer_1 = ResourceOffer( 'offer_1', self.agent_1.agent_id, self.framework_id, NodeResources([Cpus(2.0), Mem(22048.0), Disk(1024.0)]), now(), None) offer_2 = ResourceOffer( 'offer_2', self.agent_2.agent_id, self.framework_id, NodeResources([Cpus(25.0), Mem(2048.0), Disk(2048.0)]), now(), None) offer_3 = ResourceOffer( 'offer_3', self.agent_2.agent_id, self.framework_id, NodeResources([Cpus(225.0), Mem(1024.0), Disk(22048.0)]), now(), None) resource_mgr.add_new_offers([offer_1, offer_2, offer_3]) resource_mgr.refresh_agent_resources([], now()) all_available_resources = resource_mgr.get_all_available_resources() self.assertDictEqual(all_available_resources, { 'mem': 25120.0, 'gpus': 0.0, 'disk': 25120.0, 'cpus': 252.0 })
def test_get_queued_resources(self): """Tests successfully getting queued resource information""" offer_1 = ResourceOffer( 'offer_1', self.agent_1.agent_id, self.framework_id, NodeResources([Cpus(2.0), Mem(22048.0), Disk(1024.0)]), now(), None) offer_2 = ResourceOffer( 'offer_2', self.agent_2.agent_id, self.framework_id, NodeResources([Cpus(25.0), Mem(2048.0), Disk(2048.0)]), now(), None) offer_3 = ResourceOffer( 'offer_3', self.agent_2.agent_id, self.framework_id, NodeResources([Cpus(225.0), Mem(1024.0), Disk(22048.0)]), now(), None) resource_mgr.add_new_offers([offer_1, offer_2, offer_3]) resource_mgr.refresh_agent_resources([], now()) resource_db = ClusterResources.objects.first() self.assertIsNone(resource_db) resource_mgr.update_all_cluster_resources() resource_db = ClusterResources.objects.first() self.assertIsNotNone(resource_db) self.assertEqual(resource_db.mem, 25120.0) self.assertEqual(resource_db.gpus, 0.0) self.assertEqual(resource_db.disk, 25120.0) self.assertEqual(resource_db.cpus, 252.0) queued_resources = resource_mgr.get_queued_resources() self.assertDictEqual( queued_resources, { "cluster_resources": { 'cpus': 252, 'disk': 25120, 'gpus': 0, 'mem': 25120 }, "queue_lengths": { 'PENDING': 0, 'QUEUED': 3, 'RUNNING': 0 }, "total_resources": { 'PENDING': {}, 'QUEUED': { 'cpus': 3.0, 'mem': 384.0 }, 'RUNNING': {} } })
def test_update_all_cluster_resources_no_resources(self): """Tests updating the all cluster resources database when none are defined.""" resource_mgr.refresh_agent_resources([], now()) resource_db = ClusterResources.objects.first() self.assertIsNone(resource_db) resource_mgr.update_all_cluster_resources() resource_db = ClusterResources.objects.first() self.assertIsNone(resource_db)
def setUp(self): django.setup() resource_mgr.clear() self.agent_1 = Agent('agent_1', 'host_1') self.agent_2 = Agent('agent_2', 'host_2') self.framework_id = '1234' offer_1 = ResourceOffer( 'offer_1', self.agent_1.agent_id, self.framework_id, NodeResources([Cpus(2.0), Mem(1024.0), Disk(1024.0)]), now(), None) offer_2 = ResourceOffer( 'offer_2', self.agent_2.agent_id, self.framework_id, NodeResources([Cpus(25.0), Mem(2048.0), Disk(2048.0)]), now(), None) resource_mgr.add_new_offers([offer_1, offer_2]) resource_mgr.refresh_agent_resources([], now())
def _prepare_nodes(self, tasks, running_job_exes, when): """Prepares the nodes to use for scheduling :param tasks: The current current running :type tasks: list :param running_job_exes: The currently running job executions :type running_job_exes: list :param when: The current time :type when: :class:`datetime.datetime` :returns: The dict of scheduling nodes stored by node ID :rtype: dict """ nodes = node_mgr.get_nodes() # Group tasks by agent ID tasks_by_agent_id = {} # {Agent ID: List of tasks} for task in tasks: if task.agent_id not in tasks_by_agent_id: tasks_by_agent_id[task.agent_id] = [task] else: tasks_by_agent_id[task.agent_id].append(task) # Group job executions by node ID running_exes_by_node_id = {} # {Node ID: List of running job exes} for running_job_exe in running_job_exes: if running_job_exe.node_id not in running_exes_by_node_id: running_exes_by_node_id[running_job_exe.node_id] = [ running_job_exe ] else: running_exes_by_node_id[running_job_exe.node_id].append( running_job_exe) agent_resources = resource_mgr.refresh_agent_resources(tasks, when) scheduling_nodes = {} # {Node ID: SchedulingNode} for node in nodes: agent_id = node.agent_id # Grab agent ID once since it could change while we are scheduling if agent_id in tasks_by_agent_id: node_tasks = tasks_by_agent_id[agent_id] else: node_tasks = [] if node.id in running_exes_by_node_id: node_exes = running_exes_by_node_id[node.id] else: node_exes = [] if agent_id in agent_resources: resource_set = agent_resources[agent_id] else: resource_set = ResourceSet() scheduling_node = SchedulingNode(agent_id, node, node_tasks, node_exes, resource_set) scheduling_nodes[scheduling_node.node_id] = scheduling_node return scheduling_nodes