def test_change_agent_id_with_inactive_node(self): """Tests the NodeManager where a registered node changes its agent ID, and the node is inactive""" manager = NodeManager() manager.register_agents([self.agent_1, self.agent_2]) manager.sync_with_database(scheduler_mgr.config) # Node 2 is now inactive Node.objects.filter( id=manager.get_node(self.agent_2.agent_id).id).update( is_active=False) manager.sync_with_database(scheduler_mgr.config) manager.lost_node(self.agent_2.agent_id) manager.register_agents([self.agent_3]) manager.sync_with_database(scheduler_mgr.config) # Make sure two nodes are registered, one for agent 1 and one for agent 3, and both are online nodes = manager.get_nodes() self.assertEqual(len(nodes), 2) node_1 = manager.get_node(self.agent_1.agent_id) self.assertEqual(node_1.hostname, self.node_1.hostname) self.assertTrue(node_1._is_online) self.assertIsNone(manager.get_node(self.agent_2.agent_id)) node_2 = manager.get_node(self.agent_3.agent_id) self.assertEqual(node_2.hostname, 'host_2') self.assertTrue(node_2._is_online) self.assertFalse(node_2._is_active)
def test_change_agent_id_with_inactive_node(self, mock_get_slaves): """Tests the NodeManager where a registered node changes its agent ID, and the node is inactive""" mock_get_slaves.return_value = self.slave_infos manager = NodeManager() manager.register_agent_ids([self.node_agent_1, self.node_agent_2]) manager.sync_with_database('master_host', 5050) # Node 2 is now inactive Node.objects.filter(id=manager.get_node(self.node_agent_2).id).update(is_active=False) manager.sync_with_database('master_host', 5050) mock_get_slaves.return_value = self.slave_infos_updated manager.lost_node(self.node_agent_2) manager.register_agent_ids([self.node_agent_3]) manager.sync_with_database('master_host', 5050) # Make sure two nodes are registered, one for agent 1 and one for agent 3, and both are online nodes = manager.get_nodes() self.assertEqual(len(nodes), 2) node_1 = manager.get_node(self.node_agent_1) self.assertEqual(node_1.hostname, self.node_1.hostname) self.assertTrue(node_1._is_online) self.assertIsNone(manager.get_node(self.node_agent_2)) node_2 = manager.get_node(self.node_agent_3) self.assertEqual(node_2.hostname, 'host_2') self.assertTrue(node_2._is_online) self.assertFalse(node_2._is_active)
def test_lost_known_node(self): """Tests the NodeManager where a known node was lost""" manager = NodeManager() manager.register_agents([self.agent_1, self.agent_2]) manager.sync_with_database(scheduler_mgr.config) manager.lost_node(self.agent_2.agent_id) nodes = manager.get_nodes() self.assertEqual(len(nodes), 2) node_1 = manager.get_node(self.agent_1.agent_id) self.assertTrue(node_1._is_online) node_2 = manager.get_node(self.agent_2.agent_id) self.assertFalse(node_2._is_online)
def test_lost_unknown_node(self): """Tests the NodeManager where an unknown node was lost""" manager = NodeManager() manager.register_agents([self.agent_1, self.agent_2]) manager.lost_node(self.agent_2.agent_id) manager.sync_with_database(scheduler_mgr.config) # Unknown node 2 was lost before syncing with database, it should not appear in the manager nodes = manager.get_nodes() self.assertEqual(len(nodes), 1) node_1 = manager.get_node(self.agent_1.agent_id) self.assertEqual(node_1.hostname, self.node_1.hostname) self.assertTrue(node_1._is_online) self.assertIsNone(manager.get_node(self.agent_2.agent_id))
def test_job_exe_no_offers(self): """Tests the NodeManager where a node is running an exe and has not given offers to Scale in 1 hour. Expected behavior: The node is scheduler and DB are in sync and the node is still active""" last_offer = now() - datetime.timedelta(hours=1) node_mgr = NodeManager() node_mgr.register_agents([self.agent_1]) node_mgr.sync_with_database(scheduler_mgr.config) # Add job to node job_test_utils.create_running_job_exe(agent_id=self.agent_1, node=self.node_1) # Set last_offer_received to 1 hour ago Node.objects.filter(id=self.node_1.id).update( last_offer_received=last_offer) # This inspects what nodes are running jobs and what nodes need to be removed if they # have not sent offers in the last 5 minutes node_mgr.sync_with_database(scheduler_mgr.config) # Get the DB and Scheduler state and make sure they are consistent db_record = Node.objects.get(id=self.node_1.id) scheduler_record = node_mgr.get_node(self.agent_1.agent_id) self.assertEqual(db_record.is_active, scheduler_record._is_active, True)
def test_lost_known_node(self, mock_get_slaves): """Tests the NodeManager where a known node was lost""" mock_get_slaves.return_value = self.slave_infos manager = NodeManager() manager.register_agent_ids([self.node_agent_1, self.node_agent_2]) manager.sync_with_database('master_host', 5050) manager.lost_node(self.node_agent_2) nodes = manager.get_nodes() self.assertEqual(len(nodes), 2) node_1 = manager.get_node(self.node_agent_1) self.assertTrue(node_1.is_online) node_2 = manager.get_node(self.node_agent_2) self.assertFalse(node_2.is_online)
def test_lost_known_node(self, mock_get_slaves): """Tests the NodeManager where a known node was lost""" mock_get_slaves.return_value = self.slave_infos manager = NodeManager() manager.register_agent_ids([self.node_agent_1, self.node_agent_2]) manager.sync_with_database('master_host', 5050) manager.lost_node(self.node_agent_2) nodes = manager.get_nodes() self.assertEqual(len(nodes), 2) node_1 = manager.get_node(self.node_agent_1) self.assertTrue(node_1._is_online) node_2 = manager.get_node(self.node_agent_2) self.assertFalse(node_2._is_online)
def test_lost_unknown_node(self, mock_get_slaves): """Tests the NodeManager where an unknown node was lost""" mock_get_slaves.return_value = self.slave_infos manager = NodeManager() manager.register_agent_ids([self.node_agent_1, self.node_agent_2]) manager.lost_node(self.node_agent_2) manager.sync_with_database('master_host', 5050) # Unknown node 2 was lost before syncing with database, it should not appear in the manager nodes = manager.get_nodes() self.assertEqual(len(nodes), 1) node_1 = manager.get_node(self.node_agent_1) self.assertEqual(node_1.hostname, self.node_1.hostname) self.assertTrue(node_1.is_online) self.assertIsNone(manager.get_node(self.node_agent_2))
def test_lost_unknown_node(self, mock_get_slaves): """Tests the NodeManager where an unknown node was lost""" mock_get_slaves.return_value = self.slave_infos manager = NodeManager() manager.register_agent_ids([self.node_agent_1, self.node_agent_2]) manager.lost_node(self.node_agent_2) manager.sync_with_database('master_host', 5050) # Unknown node 2 was lost before syncing with database, it should not appear in the manager nodes = manager.get_nodes() self.assertEqual(len(nodes), 1) node_1 = manager.get_node(self.node_agent_1) self.assertEqual(node_1.hostname, self.node_1.hostname) self.assertTrue(node_1._is_online) self.assertIsNone(manager.get_node(self.node_agent_2))
def test_change_agent_id(self): """Tests the NodeManager where a registered node changes its agent ID""" manager = NodeManager() manager.register_agents([self.agent_1, self.agent_2]) manager.sync_with_database(scheduler_mgr.config) manager.lost_node(self.agent_2.agent_id) manager.register_agents([self.agent_3]) manager.sync_with_database(scheduler_mgr.config) # Make sure two nodes are registered, one for agent 1 and one for agent 3, and both are online nodes = manager.get_nodes() self.assertEqual(len(nodes), 2) node_1 = manager.get_node(self.agent_1.agent_id) self.assertEqual(node_1.hostname, self.node_1.hostname) self.assertTrue(node_1._is_online) self.assertIsNone(manager.get_node(self.agent_2.agent_id)) node_2 = manager.get_node(self.agent_3.agent_id) self.assertEqual(node_2.hostname, 'host_2') self.assertTrue(node_2._is_online)
def test_change_agent_id(self, mock_get_slaves): """Tests the NodeManager where a registered node changes its agent ID""" mock_get_slaves.return_value = self.slave_infos manager = NodeManager() manager.register_agent_ids([self.node_agent_1, self.node_agent_2]) manager.sync_with_database('master_host', 5050) mock_get_slaves.return_value = self.slave_infos_updated manager.lost_node(self.node_agent_2) manager.register_agent_ids([self.node_agent_3]) manager.sync_with_database('master_host', 5050) # Make sure two nodes are registered, one for agent 1 and one for agent 3, and both are online nodes = manager.get_nodes() self.assertEqual(len(nodes), 2) node_1 = manager.get_node(self.node_agent_1) self.assertEqual(node_1.hostname, self.node_1.hostname) self.assertTrue(node_1.is_online) self.assertIsNone(manager.get_node(self.node_agent_2)) node_2 = manager.get_node(self.node_agent_3) self.assertEqual(node_2.hostname, 'host_2') self.assertTrue(node_2.is_online)
def test_no_job_exe_no_offers(self): """Tests the NodeManager where a node is not running an exe and has not given offers to Scale in 1 hour. Expected behavior: The node is deleted and the DB model is update with is_active=False""" last_offer = now() - datetime.timedelta(hours=1) node_mgr = NodeManager() node_mgr.register_agents([self.agent_1]) node_mgr.sync_with_database(scheduler_mgr.config) # Set last_offer_received to 1 hour ago Node.objects.filter(id=self.node_1.id).update(last_offer_received=last_offer) # This inspects what nodes are running jobs and what nodes need to be removed if they # have not sent offers in the last 5 minutes node_mgr.sync_with_database(scheduler_mgr.config) # Get the DB state db_record = Node.objects.get(id=self.node_1.id) self.assertIsNone(node_mgr.get_node(self.agent_1.agent_id)) self.assertEqual(db_record.is_active, False)