def test_secondary_connection(self): self.c = ReplicaSetConnection( self.seed, replicaSet=self.name, use_greenlets=use_greenlets) self.assertTrue(bool(len(self.c.secondaries))) db = self.c.pymongo_test db.test.remove({}, safe=True, w=len(self.c.secondaries)) # Force replication... w = len(self.c.secondaries) + 1 db.test.insert({'foo': 'bar'}, safe=True, w=w) # Test direct connection to a primary or secondary primary_host, primary_port = replset_tools.get_primary().split(':') primary_port = int(primary_port) secondary_host, secondary_port = replset_tools.get_secondaries()[0].split(':') secondary_port = int(secondary_port) self.assertTrue(Connection( primary_host, primary_port, use_greenlets=use_greenlets).is_primary) self.assertTrue(Connection( primary_host, primary_port, use_greenlets=use_greenlets, read_preference=ReadPreference.PRIMARY_PREFERRED).is_primary) self.assertTrue(Connection( primary_host, primary_port, use_greenlets=use_greenlets, read_preference=ReadPreference.SECONDARY_PREFERRED).is_primary) self.assertTrue(Connection( primary_host, primary_port, use_greenlets=use_greenlets, read_preference=ReadPreference.NEAREST).is_primary) self.assertTrue(Connection( primary_host, primary_port, use_greenlets=use_greenlets, read_preference=ReadPreference.SECONDARY).is_primary) for kwargs in [ {'read_preference': ReadPreference.PRIMARY_PREFERRED}, {'read_preference': ReadPreference.SECONDARY}, {'read_preference': ReadPreference.SECONDARY_PREFERRED}, {'read_preference': ReadPreference.NEAREST}, {'slave_okay': True}, ]: conn = Connection( secondary_host, secondary_port, use_greenlets=use_greenlets, **kwargs) self.assertEqual(secondary_host, conn.host) self.assertEqual(secondary_port, conn.port) self.assertFalse(conn.is_primary) self.assert_(conn.pymongo_test.test.find_one()) # Test direct connection to an arbiter secondary_host = replset_tools.get_arbiters()[0] host, port = replset_tools.arbiters()[0].split(':') port = int(port) conn = Connection(host, port) self.assertEqual(host, conn.host) self.assertEqual(port, conn.port)
def test_read_preference(self): c = ReplicaSetConnection(self.seed, replicaSet=self.name) self.assertTrue(bool(len(c.secondaries))) db = c.pymongo_test db.test.remove({}, safe=True, w=len(c.secondaries)) # Force replication... w = len(c.secondaries) + 1 db.test.insert({'foo': 'bar'}, safe=True, w=w) # Test direct connection to a secondary host, port = replset_tools.get_secondaries()[0].split(':') port = int(port) conn = Connection(host, port, slave_okay=True) self.assertEqual(host, conn.host) self.assertEqual(port, conn.port) self.assert_(conn.pymongo_test.test.find_one()) conn = Connection(host, port, read_preference=ReadPreference.SECONDARY) self.assertEqual(host, conn.host) self.assertEqual(port, conn.port) self.assert_(conn.pymongo_test.test.find_one()) # Test direct connection to an arbiter host = replset_tools.get_arbiters()[0] self.assertRaises(ConnectionFailure, Connection, host) # Test PRIMARY for _ in xrange(10): cursor = db.test.find() cursor.next() self.assertEqual(cursor._Cursor__connection_id, c.primary) # Test SECONDARY with a secondary db.read_preference = ReadPreference.SECONDARY for _ in xrange(10): cursor = db.test.find() cursor.next() self.assertTrue(cursor._Cursor__connection_id in c.secondaries) # Test SECONDARY_ONLY with a secondary db.read_preference = ReadPreference.SECONDARY_ONLY for _ in xrange(10): cursor = db.test.find() cursor.next() self.assertTrue(cursor._Cursor__connection_id in c.secondaries) # Test SECONDARY with no secondary killed = replset_tools.kill_all_secondaries() self.assertTrue(bool(len(killed))) db.read_preference = ReadPreference.SECONDARY for _ in xrange(10): cursor = db.test.find() cursor.next() self.assertEqual(cursor._Cursor__connection_id, c.primary) # Test SECONDARY_ONLY with no secondary db.read_preference = ReadPreference.SECONDARY_ONLY for _ in xrange(10): cursor = db.test.find() self.assertRaises(AutoReconnect, cursor.next) replset_tools.restart_members(killed) # Test PRIMARY with no primary (should raise an exception) db.read_preference = ReadPreference.PRIMARY cursor = db.test.find() cursor.next() self.assertEqual(cursor._Cursor__connection_id, c.primary) killed = replset_tools.kill_primary() self.assertTrue(bool(len(killed))) self.assertRaises(AutoReconnect, db.test.find_one)