Exemple #1
0
    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': {}
                }
            })
Exemple #2
0
    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)])))
Exemple #3
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)
Exemple #4
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
        })
Exemple #5
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': {}
                }
            })
Exemple #6
0
    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)
Exemple #7
0
 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())
Exemple #8
0
    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