class ShardsTestCase(unittest.TestCase): def setUp(self): self.sh = ShardedClusters() PortPool().change_range() def tearDown(self): self.sh.cleanup() def test_singleton(self): self.assertEqual(id(self.sh), id(ShardedClusters())) def test_bool(self): self.assertEqual(False, bool(self.sh)) self.sh.create({'id': 'sh01'}) self.assertEqual(True, bool(self.sh)) def test_operations(self): config = {'shards': [{}, {}, {}]} cluster = ShardedCluster(config) self.assertEqual(len(self.sh), 0) operator.setitem(self.sh, 1, cluster) self.assertEqual(len(self.sh), 1) self.assertEqual(operator.getitem(self.sh, 1)['id'], cluster.id) operator.delitem(self.sh, 1) self.assertEqual(len(self.sh), 0) self.assertRaises(KeyError, operator.getitem, self.sh, 1) cluster.cleanup() def test_operations2(self): self.assertTrue(len(self.sh) == 0) config1 = {'id': 'sh01'} config2 = {'id': 'sh02'} self.sh.create(config1) self.sh.create(config2) self.assertTrue(len(self.sh) == 2) for key in self.sh: self.assertTrue(key in ('sh01', 'sh02')) for key in ('sh01', 'sh02'): self.assertTrue(key in self.sh) def test_cleanup(self): config1 = {'id': 'sh01'} config2 = {'id': 'sh02'} self.assertTrue(len(self.sh) == 0) self.sh.create(config1) self.sh.create(config2) self.assertTrue(len(self.sh) == 2) self.sh.cleanup() self.assertTrue(len(self.sh) == 0) def test_sh_new(self): port = PortPool().port(check=True) config = { 'id': 'shard_cluster_1', 'configsvrs': [{}], 'routers': [{"port": port}], 'shards': [{'id': 'sh01'}, {'id': 'sh02'}, {'id': 'sh-rs-01', 'shardParams': {'id': 'rs1', 'members': [{}, {}]}}, ] } cluster_id = self.sh.create(config) self.assertEqual(cluster_id, 'shard_cluster_1') host = "{hostname}:{port}".format(hostname=HOSTNAME, port=port) c = pymongo.MongoClient(host) result = c.admin.command("listShards") for shard in result['shards']: shard['_id'] in ('sh01', 'sh02', 'sh-rs-01') c.close() def test_sh_new_with_auth(self): port = PortPool().port(check=True) config = { 'id': 'shard_cluster_1', 'auth_key': 'secret', 'login': '******', 'password': '******', 'configsvrs': [{}], 'routers': [{"port": port}], 'shards': [{'id': 'sh01'}, {'id': 'sh02'}] } self.sh.create(config) host = "{hostname}:{port}".format(hostname=HOSTNAME, port=port) c = pymongo.MongoClient(host) self.assertRaises(pymongo.errors.OperationFailure, c.admin.command, "listShards") c.admin.authenticate('admin', 'adminpass') self.assertTrue(isinstance(c.admin.command("listShards"), dict)) c.close() def test_sh_del(self): sh1_id = self.sh.create({}) sh2_id = self.sh.create({}) self.assertEqual(len(self.sh), 2) self.sh.remove(sh1_id) self.assertEqual(len(self.sh), 1) self.sh.remove(sh2_id) self.assertEqual(len(self.sh), 0) def test_info(self): config = { 'configsvrs': [{}, {}, {}], 'routers': [{}, {}, {}], 'shards': [{}, {}] } sh_id = self.sh.create(config) info = self.sh.info(sh_id) self.assertTrue(isinstance(info, dict)) for item in ("shards", "configsvrs", "routers", "mongodb_uri", "orchestration"): self.assertTrue(item in info) self.assertEqual(len(info['shards']), 2) self.assertEqual(len(info['configsvrs']), 3) self.assertEqual(len(info['routers']), 3) mongodb_uri = info['mongodb_uri'] for router in info['routers']: self.assertIn(Servers().hostname(router['id']), mongodb_uri) self.assertTrue(mongodb_uri.find('mongodb://') == 0) self.assertEqual(info['orchestration'], 'sharded_clusters') def test_configsvrs(self): config = {} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.configsvrs(sh_id)), 1) self.sh.cleanup() config = {'configsvrs': [{}, {}, {}]} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.configsvrs(sh_id)), 3) def test_routers(self): config = {} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.routers(sh_id)), 1) self.sh.cleanup() config = {'routers': [{}, {}, {}]} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.routers(sh_id)), 3) def test_router_add(self): config = {} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.routers(sh_id)), 1) self.sh.router_add(sh_id, {}) self.assertEqual(len(self.sh.routers(sh_id)), 2) self.sh.router_add(sh_id, {}) self.assertEqual(len(self.sh.routers(sh_id)), 3) self.sh.cleanup() def test_members(self): port = PortPool().port(check=True) config = {'routers': [{'port': port}]} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.members(sh_id)), 0) self.sh.cleanup() config = {'routers': [{'port': port}], 'shards': [{}, {}, {}]} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.members(sh_id)), 3) def test_member_info(self): config = {'shards': [{'id': 'member1'}, {'id': 'sh-rs-01', 'shardParams': {'id': 'rs1', 'members': [{}, {}]}}]} sh_id = self.sh.create(config) info = self.sh.member_info(sh_id, 'member1') self.assertEqual(info['id'], 'member1') self.assertTrue(info['isServer']) self.assertTrue('_id' in info) info = self.sh.member_info(sh_id, 'sh-rs-01') self.assertEqual(info['id'], 'sh-rs-01') self.assertTrue(info['isReplicaSet']) self.assertTrue('_id' in info) def test_member_info_with_auth(self): config = {'auth_key': 'secret', 'login': '******', 'password': '******', 'shards': [{'id': 'member1'}, {'id': 'sh-rs-01', 'shardParams': {'id': 'rs1', 'members': [{}, {}]}}]} sh_id = self.sh.create(config) info = self.sh.member_info(sh_id, 'member1') self.assertEqual(info['id'], 'member1') self.assertTrue(info['isServer']) self.assertTrue('_id' in info) info = self.sh.member_info(sh_id, 'sh-rs-01') self.assertEqual(info['id'], 'sh-rs-01') self.assertTrue(info['isReplicaSet']) self.assertTrue('_id' in info) def test_member_del(self): port = PortPool().port(check=True) config = {'routers': [{'port': port}], 'shards': [{'id': 'member1'}, {'id': 'member2'}, {'id': 'sh-rs-01', 'shardParams': {'id': 'rs1', 'members': [{}, {}]}}]} sh_id = self.sh.create(config) host = "{hostname}:{port}".format(hostname=HOSTNAME, port=port) c = pymongo.MongoClient(host) result = c.admin.command("listShards") self.assertEqual(len(result['shards']), 3) # remove member-host result = self.sh.member_del(sh_id, 'member1') self.assertEqual(len(c.admin.command("listShards")['shards']), 3) self.assertEqual(result['state'], 'started') self.assertEqual(result['shard'], 'member1') time.sleep(5) result = self.sh.member_del(sh_id, 'member1') self.assertEqual(result['state'], 'completed') self.assertEqual(len(c.admin.command("listShards")['shards']), 2) self.assertEqual(result['shard'], 'member1') # remove member-replicaset result = self.sh.member_del(sh_id, 'sh-rs-01') self.assertEqual(len(c.admin.command("listShards")['shards']), 2) self.assertEqual(result['state'], 'started') self.assertEqual(result['shard'], 'sh-rs-01') time.sleep(7) result = self.sh.member_del(sh_id, 'sh-rs-01') self.assertEqual(result['state'], 'completed') self.assertEqual(len(c.admin.command("listShards")['shards']), 1) self.assertEqual(result['shard'], 'sh-rs-01') def test_member_add(self): port = PortPool().port(check=True) config = {'routers': [{'port': port}]} sh_id = self.sh.create(config) host = "{hostname}:{port}".format(hostname=HOSTNAME, port=port) c = pymongo.MongoClient(host) self.assertEqual(len(c.admin.command("listShards")['shards']), 0) result = self.sh.member_add(sh_id, {'id': 'test1', 'shardParams': {}}) self.assertTrue(result.get('isServer', False)) self.assertEqual(result['id'], 'test1') self.assertEqual(len(c.admin.command("listShards")['shards']), 1) result = self.sh.member_add(sh_id, {'id': 'test2', 'shardParams': {'id': 'rs1', 'members': [{}, {}]}}) self.assertFalse(result.get('isServer', False)) self.assertTrue(result.get('isReplicaSet', False)) self.assertEqual(result['id'], 'test2') self.assertEqual(len(c.admin.command("listShards")['shards']), 2)
class ShardsTestCase(unittest.TestCase): def setUp(self): self.sh = ShardedClusters() PortPool().change_range() def tearDown(self): self.sh.cleanup() def test_singleton(self): self.assertEqual(id(self.sh), id(ShardedClusters())) def test_bool(self): self.assertEqual(False, bool(self.sh)) self.sh.create({'id': 'sh01'}) self.assertEqual(True, bool(self.sh)) def test_operations(self): config = {'shards': [{}, {}, {}]} cluster = ShardedCluster(config) self.assertEqual(len(self.sh), 0) operator.setitem(self.sh, 1, cluster) self.assertEqual(len(self.sh), 1) self.assertEqual(operator.getitem(self.sh, 1)['id'], cluster.id) operator.delitem(self.sh, 1) self.assertEqual(len(self.sh), 0) self.assertRaises(KeyError, operator.getitem, self.sh, 1) cluster.cleanup() def test_operations2(self): self.assertTrue(len(self.sh) == 0) config1 = {'id': 'sh01'} config2 = {'id': 'sh02'} self.sh.create(config1) self.sh.create(config2) self.assertTrue(len(self.sh) == 2) for key in self.sh: self.assertTrue(key in ('sh01', 'sh02')) for key in ('sh01', 'sh02'): self.assertTrue(key in self.sh) def test_cleanup(self): config1 = {'id': 'sh01'} config2 = {'id': 'sh02'} self.assertTrue(len(self.sh) == 0) self.sh.create(config1) self.sh.create(config2) self.assertTrue(len(self.sh) == 2) self.sh.cleanup() self.assertTrue(len(self.sh) == 0) def test_sh_new(self): port = PortPool().port(check=True) config = { 'id': 'shard_cluster_1', 'configsvrs': [{}], 'routers': [{ "port": port }], 'shards': [ { 'id': 'sh01' }, { 'id': 'sh02' }, { 'id': 'sh-rs-01', 'shardParams': { 'id': 'rs1', 'members': [{}, {}] } }, ] } cluster_id = self.sh.create(config) self.assertEqual(cluster_id, 'shard_cluster_1') host = "{hostname}:{port}".format(hostname=HOSTNAME, port=port) c = pymongo.MongoClient(host) result = c.admin.command("listShards") for shard in result['shards']: shard['_id'] in ('sh01', 'sh02', 'sh-rs-01') c.close() def test_sh_new_with_auth(self): port = PortPool().port(check=True) config = { 'id': 'shard_cluster_1', 'auth_key': 'secret', 'login': '******', 'password': '******', 'configsvrs': [{}], 'routers': [{ "port": port }], 'shards': [{ 'id': 'sh01' }, { 'id': 'sh02' }] } self.sh.create(config) host = "{hostname}:{port}".format(hostname=HOSTNAME, port=port) c = pymongo.MongoClient(host) self.assertRaises(pymongo.errors.OperationFailure, c.admin.command, "listShards") c.admin.authenticate('admin', 'adminpass') self.assertTrue(isinstance(c.admin.command("listShards"), dict)) c.close() def test_sh_del(self): sh1_id = self.sh.create({}) sh2_id = self.sh.create({}) self.assertEqual(len(self.sh), 2) self.sh.remove(sh1_id) self.assertEqual(len(self.sh), 1) self.sh.remove(sh2_id) self.assertEqual(len(self.sh), 0) def test_info(self): config = { 'configsvrs': [{}, {}, {}], 'routers': [{}, {}, {}], 'shards': [{}, {}] } sh_id = self.sh.create(config) info = self.sh.info(sh_id) self.assertTrue(isinstance(info, dict)) for item in ("shards", "configsvrs", "routers", "mongodb_uri", "orchestration"): self.assertTrue(item in info) self.assertEqual(len(info['shards']), 2) self.assertEqual(len(info['configsvrs']), 3) self.assertEqual(len(info['routers']), 3) mongodb_uri = info['mongodb_uri'] for router in info['routers']: self.assertIn(Servers().hostname(router['id']), mongodb_uri) self.assertTrue(mongodb_uri.find('mongodb://') == 0) self.assertEqual(info['orchestration'], 'sharded_clusters') def test_configsvrs(self): config = {} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.configsvrs(sh_id)), 1) self.sh.cleanup() config = {'configsvrs': [{}, {}, {}]} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.configsvrs(sh_id)), 3) def test_routers(self): config = {} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.routers(sh_id)), 1) self.sh.cleanup() config = {'routers': [{}, {}, {}]} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.routers(sh_id)), 3) def test_router_add(self): config = {} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.routers(sh_id)), 1) self.sh.router_add(sh_id, {}) self.assertEqual(len(self.sh.routers(sh_id)), 2) self.sh.router_add(sh_id, {}) self.assertEqual(len(self.sh.routers(sh_id)), 3) self.sh.cleanup() def test_members(self): port = PortPool().port(check=True) config = {'routers': [{'port': port}]} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.members(sh_id)), 0) self.sh.cleanup() config = {'routers': [{'port': port}], 'shards': [{}, {}, {}]} sh_id = self.sh.create(config) self.assertEqual(len(self.sh.members(sh_id)), 3) def test_member_info(self): config = { 'shards': [{ 'id': 'member1' }, { 'id': 'sh-rs-01', 'shardParams': { 'id': 'rs1', 'members': [{}, {}] } }] } sh_id = self.sh.create(config) info = self.sh.member_info(sh_id, 'member1') self.assertEqual(info['id'], 'member1') self.assertTrue(info['isServer']) self.assertTrue('_id' in info) info = self.sh.member_info(sh_id, 'sh-rs-01') self.assertEqual(info['id'], 'sh-rs-01') self.assertTrue(info['isReplicaSet']) self.assertTrue('_id' in info) def test_member_info_with_auth(self): config = { 'auth_key': 'secret', 'login': '******', 'password': '******', 'shards': [{ 'id': 'member1' }, { 'id': 'sh-rs-01', 'shardParams': { 'id': 'rs1', 'members': [{}, {}] } }] } sh_id = self.sh.create(config) info = self.sh.member_info(sh_id, 'member1') self.assertEqual(info['id'], 'member1') self.assertTrue(info['isServer']) self.assertTrue('_id' in info) info = self.sh.member_info(sh_id, 'sh-rs-01') self.assertEqual(info['id'], 'sh-rs-01') self.assertTrue(info['isReplicaSet']) self.assertTrue('_id' in info) def test_member_del(self): port = PortPool().port(check=True) config = { 'routers': [{ 'port': port }], 'shards': [{ 'id': 'member1' }, { 'id': 'member2' }, { 'id': 'sh-rs-01', 'shardParams': { 'id': 'rs1', 'members': [{}, {}] } }] } sh_id = self.sh.create(config) host = "{hostname}:{port}".format(hostname=HOSTNAME, port=port) c = pymongo.MongoClient(host) result = c.admin.command("listShards") self.assertEqual(len(result['shards']), 3) # remove member-host result = self.sh.member_del(sh_id, 'member1') self.assertEqual(len(c.admin.command("listShards")['shards']), 3) self.assertEqual(result['state'], 'started') self.assertEqual(result['shard'], 'member1') time.sleep(5) result = self.sh.member_del(sh_id, 'member1') self.assertEqual(result['state'], 'completed') self.assertEqual(len(c.admin.command("listShards")['shards']), 2) self.assertEqual(result['shard'], 'member1') # remove member-replicaset result = self.sh.member_del(sh_id, 'sh-rs-01') self.assertEqual(len(c.admin.command("listShards")['shards']), 2) self.assertEqual(result['state'], 'started') self.assertEqual(result['shard'], 'sh-rs-01') time.sleep(7) result = self.sh.member_del(sh_id, 'sh-rs-01') self.assertEqual(result['state'], 'completed') self.assertEqual(len(c.admin.command("listShards")['shards']), 1) self.assertEqual(result['shard'], 'sh-rs-01') def test_member_add(self): port = PortPool().port(check=True) config = {'routers': [{'port': port}]} sh_id = self.sh.create(config) host = "{hostname}:{port}".format(hostname=HOSTNAME, port=port) c = pymongo.MongoClient(host) self.assertEqual(len(c.admin.command("listShards")['shards']), 0) result = self.sh.member_add(sh_id, {'id': 'test1', 'shardParams': {}}) self.assertTrue(result.get('isServer', False)) self.assertEqual(result['id'], 'test1') self.assertEqual(len(c.admin.command("listShards")['shards']), 1) result = self.sh.member_add(sh_id, { 'id': 'test2', 'shardParams': { 'id': 'rs1', 'members': [{}, {}] } }) self.assertFalse(result.get('isServer', False)) self.assertTrue(result.get('isReplicaSet', False)) self.assertEqual(result['id'], 'test2') self.assertEqual(len(c.admin.command("listShards")['shards']), 2)