|
25 | 25 | ReadPreference) |
26 | 26 | from pymongo.replica_set_connection import Member, Monitor |
27 | 27 | from pymongo.connection import Connection, _partition_node |
28 | | -from pymongo.errors import AutoReconnect |
| 28 | +from pymongo.errors import AutoReconnect, OperationFailure |
29 | 29 |
|
30 | 30 | from test import utils |
31 | 31 |
|
@@ -609,6 +609,53 @@ def tearDown(self): |
609 | 609 | self.clear_ping_times() |
610 | 610 |
|
611 | 611 |
|
| 612 | +class TestReplicaSetAuth(unittest.TestCase): |
| 613 | + def setUp(self): |
| 614 | + members = [ |
| 615 | + {}, |
| 616 | + {'priority': 0}, |
| 617 | + {'priority': 0}, |
| 618 | + ] |
| 619 | + |
| 620 | + res = ha_tools.start_replica_set(members, auth=True) |
| 621 | + self.c = ReplicaSetConnection(res[0], replicaSet=res[1], |
| 622 | + use_greenlets=use_greenlets) |
| 623 | + |
| 624 | + # Add an admin user to enable auth |
| 625 | + try: |
| 626 | + self.c.admin.add_user('admin', 'adminpass') |
| 627 | + except: |
| 628 | + # SERVER-4225 |
| 629 | + pass |
| 630 | + self.c.admin.authenticate('admin', 'adminpass') |
| 631 | + |
| 632 | + self.db = self.c.pymongo_ha_auth |
| 633 | + self.db.add_user('user', 'userpass') |
| 634 | + self.c.admin.logout() |
| 635 | + |
| 636 | + def test_auth_during_failover(self): |
| 637 | + self.assertTrue(self.db.authenticate('user', 'userpass')) |
| 638 | + self.assertTrue(self.db.foo.insert({'foo': 'bar'}, |
| 639 | + safe=True, w=3, wtimeout=1000)) |
| 640 | + self.db.logout() |
| 641 | + self.assertRaises(OperationFailure, self.db.foo.find_one) |
| 642 | + |
| 643 | + primary = '%s:%d' % self.c.primary |
| 644 | + ha_tools.kill_members([primary], 2) |
| 645 | + |
| 646 | + # Let monitor notice primary's gone |
| 647 | + sleep(2 * MONITOR_INTERVAL) |
| 648 | + |
| 649 | + # Make sure we can still authenticate |
| 650 | + self.assertTrue(self.db.authenticate('user', 'userpass')) |
| 651 | + # And still query. |
| 652 | + self.db.read_preference = ReadPreference.PRIMARY_PREFERRED |
| 653 | + self.assertEqual('bar', self.db.foo.find_one()['foo']) |
| 654 | + |
| 655 | + def tearDown(self): |
| 656 | + self.c.close() |
| 657 | + ha_tools.kill_all_members() |
| 658 | + |
612 | 659 | class TestMongosHighAvailability(unittest.TestCase): |
613 | 660 | def setUp(self): |
614 | 661 | seed_list = ha_tools.create_sharded_cluster() |
|
0 commit comments