def setUp(self): super(MasterServerElectionTests, self).setUp() # create an application object config = self.getMasterConfiguration(master_number=1) self.app = Application(config) self.app.em.close() self.app.pt.clear() self.app.name = 'NEOCLUSTER' self.app.em = Mock() self.election = ServerElectionHandler(self.app) self.app.unconnected_master_node_set = set() self.app.negotiating_master_node_set = set() for node in self.app.nm.getMasterList(): node.setState(NodeStates.RUNNING) # define some variable to simulate client and storage node self.client_address = (self.local_ip, 1000) self.storage_address = (self.local_ip, 2000) self.master_address = (self.local_ip, 3000) # apply monkey patches ClientConnection._addPacket = _addPacket
class MasterServerElectionTests(MasterClientElectionTestBase): def setUp(self): super(MasterServerElectionTests, self).setUp() # create an application object config = self.getMasterConfiguration(master_number=1) self.app = Application(config) self.app.em.close() self.app.pt.clear() self.app.name = 'NEOCLUSTER' self.app.em = Mock() self.election = ServerElectionHandler(self.app) self.app.unconnected_master_node_set = set() self.app.negotiating_master_node_set = set() for node in self.app.nm.getMasterList(): node.setState(NodeStates.RUNNING) # define some variable to simulate client and storage node self.client_address = (self.local_ip, 1000) self.storage_address = (self.local_ip, 2000) self.master_address = (self.local_ip, 3000) # apply monkey patches ClientConnection._addPacket = _addPacket def _tearDown(self, success): NeoUnitTestBase._tearDown(self, success) # restore environnement del ClientConnection._addPacket def test_requestIdentification1(self): """ A non-master node request identification """ node, conn = self.identifyToMasterNode() args = (node.getUUID(), node.getAddress(), self.app.name) self.assertRaises(protocol.NotReadyError, self.election.requestIdentification, conn, NodeTypes.CLIENT, *args) def test_requestIdentification3(self): """ A broken master node request identification """ node, conn = self.identifyToMasterNode() node.setBroken() args = (node.getUUID(), node.getAddress(), self.app.name) self.assertRaises(protocol.BrokenNodeDisallowedError, self.election.requestIdentification, conn, NodeTypes.MASTER, *args) def test_requestIdentification4(self): """ No conflict """ node, conn = self.identifyToMasterNode() args = (node.getUUID(), node.getAddress(), self.app.name) self.election.requestIdentification(conn, NodeTypes.MASTER, *args) self.checkUUIDSet(conn, node.getUUID()) args = self.checkAcceptIdentification(conn, decode=True) (node_type, uuid, partitions, replicas, new_uuid, primary_uuid, master_list) = args self.assertEqual(node.getUUID(), new_uuid) self.assertNotEqual(node.getUUID(), uuid) def _getNodeList(self): return [x.asTuple() for x in self.app.nm.getList()] def __getClient(self): uuid = self.getClientUUID() conn = self.getFakeConnection(uuid=uuid, address=self.client_address) self.app.nm.createClient(uuid=uuid, address=self.client_address) return conn def __getMaster(self, port=1000, register=True): uuid = self.getMasterUUID() address = ('127.0.0.1', port) conn = self.getFakeConnection(uuid=uuid, address=address) if register: self.app.nm.createMaster(uuid=uuid, address=address) return conn def testRequestIdentification1(self): """ Check with a non-master node, must be refused """ conn = self.__getClient() self.checkNotReadyErrorRaised(self.election.requestIdentification, conn=conn, node_type=NodeTypes.CLIENT, uuid=conn.getUUID(), address=conn.getAddress(), name=self.app.name) def _requestIdentification(self): conn = self.getFakeConnection() peer_uuid = self.getMasterUUID() address = (self.local_ip, 2001) self.election.requestIdentification( conn, NodeTypes.MASTER, peer_uuid, address, self.app.name, ) node_type, uuid, partitions, replicas, _peer_uuid, primary, \ master_list = self.checkAcceptIdentification(conn, decode=True) self.assertEqual(node_type, NodeTypes.MASTER) self.assertEqual(uuid, self.app.uuid) self.assertEqual(partitions, self.app.pt.getPartitions()) self.assertEqual(replicas, self.app.pt.getReplicas()) self.assertTrue(address in [x[0] for x in master_list]) self.assertTrue(self.app.server in [x[0] for x in master_list]) self.assertEqual(peer_uuid, _peer_uuid) return primary def testRequestIdentificationDoesNotKnowPrimary(self): self.app.primary = False self.app.primary_master_node = None self.assertEqual(self._requestIdentification(), None) def testRequestIdentificationKnowsPrimary(self): self.app.primary = False primary = (self.local_ip, 3000) self.app.primary_master_node = Mock({ 'getAddress': primary, }) self.assertEqual(self._requestIdentification(), primary) def testRequestIdentificationIsPrimary(self): self.app.primary = True primary = self.app.server self.app.primary_master_node = Mock({ 'getAddress': primary, }) self.assertEqual(self._requestIdentification(), primary) def test_reelectPrimary(self): node, conn = self.identifyToMasterNode() self.assertRaises(ElectionFailure, self.election.reelectPrimary, conn)