Example #1
0
 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
Example #2
0
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)