def setUp(self):
     super(GuestAgentMongoDBClusterManagerTest, self).setUp()
     self.context = TroveContext()
     self.manager = Manager()
예제 #2
0
 def setUp(self):
     super(GuestAgentMongoDBClusterManagerTest, self).setUp()
     self.context = TroveContext()
     self.manager = Manager()
class GuestAgentMongoDBClusterManagerTest(testtools.TestCase):

    def setUp(self):
        super(GuestAgentMongoDBClusterManagerTest, self).setUp()
        self.context = TroveContext()
        self.manager = Manager()

    def tearDown(self):
        super(GuestAgentMongoDBClusterManagerTest, self).tearDown()

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(MongoDBApp, 'add_members', side_effect=RuntimeError("Boom!"))
    def test_add_members_failure(self, mock_add_members, mock_set_status):
        members = ["test1", "test2"]
        self.assertRaises(RuntimeError, self.manager.add_members,
                          self.context, members)
        mock_set_status.assert_called_with(ds_instance.ServiceStatuses.FAILED)

    @patch.object(utils, 'poll_until')
    @patch.object(MongoDBApp, 'do_mongo')
    def test_add_member(self, mock_do_mongo, mock_poll):
        members = ["test1", "test2"]
        self.manager.add_members(self.context, members)
        mock_do_mongo.assert_any_call("rs.initiate()")
        mock_do_mongo.assert_any_call("rs.add(\"test1\")")
        mock_do_mongo.assert_any_call("rs.add(\"test2\")")

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(MongoDBApp, 'add_shard', side_effect=RuntimeError("Boom!"))
    def test_add_shard_failure(self, mock_add_shard, mock_set_status):
        self.assertRaises(RuntimeError, self.manager.add_shard,
                          self.context, "rs", "rs_member")
        mock_set_status.assert_called_with(ds_instance.ServiceStatuses.FAILED)

    @patch.object(MongoDBApp, 'do_mongo')
    def test_add_shard(self, mock_do_mongo):
        self.manager.add_shard(self.context, "rs", "rs_member")
        mock_do_mongo.assert_called_with(
            "db.adminCommand({addShard: \"rs/rs_member:27017\"})")

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(MongoDBApp, 'add_config_servers',
                  side_effect=RuntimeError("Boom!"))
    def test_add_config_server_failure(self, mock_add_config,
                                       mock_set_status):
        self.assertRaises(RuntimeError, self.manager.add_config_servers,
                          self.context,
                          ["cfg_server1", "cfg_server2"])
        mock_set_status.assert_called_with(ds_instance.ServiceStatuses.FAILED)

    @patch.object(MongoDBApp, 'start_db_with_conf_changes')
    @patch.object(MongoDBApp, '_add_config_parameter', return_value="")
    @patch.object(MongoDBApp, '_delete_config_parameters', return_value="")
    @patch.object(MongoDBApp, '_read_config', return_value="")
    def test_add_config_servers(self, mock_read, mock_delete,
                                mock_add, mock_start):
        self.manager.add_config_servers(self.context,
                                        ["cfg_server1",
                                         "cfg_server2"])
        mock_read.assert_called_with()
        mock_delete.assert_called_with("", ["dbpath", "nojournal",
                                            "smallfiles", "journal",
                                            "noprealloc", "configdb"])
        mock_add.assert_called_with("", "configdb",
                                    "cfg_server1:27019,cfg_server2:27019")
        mock_start.assert_called_with("")

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(MongoDBApp, 'write_mongos_upstart')
    @patch.object(MongoDBApp, 'reset_configuration')
    @patch.object(MongoDBApp, 'update_config_contents')
    @patch.object(netutils, 'get_my_ipv4', return_value="10.0.0.2")
    def test_prepare_mongos(self, mock_ip_address, mock_update, mock_reset,
                            mock_upstart, mock_set_status):

        self._prepare_method("test-id-1", "query_router")
        mock_update.assert_called_with(None, {'bind_ip': '10.0.0.2'})
        self.assertTrue(self.manager.app.status.is_query_router)
        mock_set_status.assert_called_with(
            ds_instance.ServiceStatuses.BUILD_PENDING)

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(utils, 'poll_until')
    @patch.object(MongoDBApp, 'start_db_with_conf_changes')
    @patch.object(MongoDBApp, 'update_config_contents')
    @patch.object(netutils, 'get_my_ipv4', return_value="10.0.0.3")
    def test_prepare_config_server(self, mock_ip_address, mock_update,
                                   mock_start, mock_poll, mock_set_status):
        self._prepare_method("test-id-2", "config_server")
        mock_update.assert_called_with(None, {'configsvr': 'true',
                                              'bind_ip': '10.0.0.3',
                                              'dbpath': '/var/lib/mongodb'})
        self.assertTrue(self.manager.app.status.is_config_server)
        mock_set_status.assert_called_with(
            ds_instance.ServiceStatuses.BUILD_PENDING)

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(utils, 'poll_until')
    @patch.object(MongoDBApp, 'start_db_with_conf_changes')
    @patch.object(MongoDBApp, 'update_config_contents')
    @patch.object(netutils, 'get_my_ipv4', return_value="10.0.0.4")
    def test_prepare_member(self, mock_ip_address, mock_update, mock_start,
                            mock_poll, mock_set_status):
        self._prepare_method("test-id-3", "member")
        mock_update.assert_called_with(None,
                                       {'bind_ip': '10.0.0.4',
                                        'dbpath': '/var/lib/mongodb',
                                        'replSet': 'rs1'})
        mock_set_status.assert_called_with(
            ds_instance.ServiceStatuses.BUILD_PENDING)

    @patch.object(volume.VolumeDevice, 'mount_points', return_value=[])
    @patch.object(volume.VolumeDevice, 'mount', return_value=None)
    @patch.object(volume.VolumeDevice, 'migrate_data', return_value=None)
    @patch.object(volume.VolumeDevice, 'format', return_value=None)
    @patch.object(MongoDBApp, 'clear_storage')
    @patch.object(MongoDBApp, 'start_db')
    @patch.object(MongoDBApp, 'stop_db')
    @patch.object(MongoDBApp, 'install_if_needed')
    @patch.object(mongo_service.MongoDbAppStatus, 'begin_install')
    def _prepare_method(self, instance_id, instance_type, *args):
        cluster_config = {"id": instance_id,
                          "shard_id": "test_shard_id",
                          "instance_type": instance_type,
                          "replica_set_name": "rs1"}

        # invocation
        self.manager.prepare(context=self.context, databases=None,
                             packages=['package'],
                             memory_mb='2048', users=None,
                             mount_point='/var/lib/mongodb',
                             overrides=None,
                             cluster_config=cluster_config)
예제 #4
0
class GuestAgentMongoDBClusterManagerTest(testtools.TestCase):
    def setUp(self):
        super(GuestAgentMongoDBClusterManagerTest, self).setUp()
        self.context = TroveContext()
        self.manager = Manager()

    def tearDown(self):
        super(GuestAgentMongoDBClusterManagerTest, self).tearDown()

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(MongoDBApp, 'add_members', side_effect=RuntimeError("Boom!"))
    def test_add_members_failure(self, mock_add_members, mock_set_status):
        members = ["test1", "test2"]
        self.assertRaises(RuntimeError, self.manager.add_members, self.context,
                          members)
        mock_set_status.assert_called_with(ds_instance.ServiceStatuses.FAILED)

    @patch.object(utils, 'poll_until')
    @patch.object(MongoDBApp, 'do_mongo')
    def test_add_member(self, mock_do_mongo, mock_poll):
        members = ["test1", "test2"]
        self.manager.add_members(self.context, members)
        mock_do_mongo.assert_any_call("rs.initiate()")
        mock_do_mongo.assert_any_call("rs.add(\"test1\")")
        mock_do_mongo.assert_any_call("rs.add(\"test2\")")

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(MongoDBApp, 'add_shard', side_effect=RuntimeError("Boom!"))
    def test_add_shard_failure(self, mock_add_shard, mock_set_status):
        self.assertRaises(RuntimeError, self.manager.add_shard, self.context,
                          "rs", "rs_member")
        mock_set_status.assert_called_with(ds_instance.ServiceStatuses.FAILED)

    @patch.object(MongoDBApp, 'do_mongo')
    def test_add_shard(self, mock_do_mongo):
        self.manager.add_shard(self.context, "rs", "rs_member")
        mock_do_mongo.assert_called_with(
            "db.adminCommand({addShard: \"rs/rs_member:27017\"})")

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(MongoDBApp,
                  'add_config_servers',
                  side_effect=RuntimeError("Boom!"))
    def test_add_config_server_failure(self, mock_add_config, mock_set_status):
        self.assertRaises(RuntimeError, self.manager.add_config_servers,
                          self.context, ["cfg_server1", "cfg_server2"])
        mock_set_status.assert_called_with(ds_instance.ServiceStatuses.FAILED)

    @patch.object(MongoDBApp, 'start_db_with_conf_changes')
    @patch.object(MongoDBApp, '_add_config_parameter', return_value="")
    @patch.object(MongoDBApp, '_delete_config_parameters', return_value="")
    @patch.object(MongoDBApp, '_read_config', return_value="")
    def test_add_config_servers(self, mock_read, mock_delete, mock_add,
                                mock_start):
        self.manager.add_config_servers(self.context,
                                        ["cfg_server1", "cfg_server2"])
        mock_read.assert_called_with()
        mock_delete.assert_called_with("", [
            "dbpath", "nojournal", "smallfiles", "journal", "noprealloc",
            "configdb"
        ])
        mock_add.assert_called_with("", "configdb",
                                    "cfg_server1:27019,cfg_server2:27019")
        mock_start.assert_called_with("")

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(MongoDBApp, 'write_mongos_upstart')
    @patch.object(MongoDBApp, 'reset_configuration')
    @patch.object(MongoDBApp, 'update_config_contents')
    @patch.object(netutils, 'get_my_ipv4', return_value="10.0.0.2")
    def test_prepare_mongos(self, mock_ip_address, mock_update, mock_reset,
                            mock_upstart, mock_set_status):

        self._prepare_method("test-id-1", "query_router")
        mock_update.assert_called_with(None, {'bind_ip': '10.0.0.2'})
        self.assertTrue(self.manager.app.status.is_query_router)
        mock_set_status.assert_called_with(
            ds_instance.ServiceStatuses.BUILD_PENDING)

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(utils, 'poll_until')
    @patch.object(MongoDBApp, 'start_db_with_conf_changes')
    @patch.object(MongoDBApp, 'update_config_contents')
    @patch.object(netutils, 'get_my_ipv4', return_value="10.0.0.3")
    def test_prepare_config_server(self, mock_ip_address, mock_update,
                                   mock_start, mock_poll, mock_set_status):
        self._prepare_method("test-id-2", "config_server")
        mock_update.assert_called_with(
            None, {
                'configsvr': 'true',
                'bind_ip': '10.0.0.3',
                'dbpath': '/var/lib/mongodb'
            })
        self.assertTrue(self.manager.app.status.is_config_server)
        mock_set_status.assert_called_with(
            ds_instance.ServiceStatuses.BUILD_PENDING)

    @patch.object(mongo_service.MongoDbAppStatus, 'set_status')
    @patch.object(utils, 'poll_until')
    @patch.object(MongoDBApp, 'start_db_with_conf_changes')
    @patch.object(MongoDBApp, 'update_config_contents')
    @patch.object(netutils, 'get_my_ipv4', return_value="10.0.0.4")
    def test_prepare_member(self, mock_ip_address, mock_update, mock_start,
                            mock_poll, mock_set_status):
        self._prepare_method("test-id-3", "member")
        mock_update.assert_called_with(None, {
            'bind_ip': '10.0.0.4',
            'dbpath': '/var/lib/mongodb',
            'replSet': 'rs1'
        })
        mock_set_status.assert_called_with(
            ds_instance.ServiceStatuses.BUILD_PENDING)

    @patch.object(volume.VolumeDevice, 'mount_points', return_value=[])
    @patch.object(volume.VolumeDevice, 'mount', return_value=None)
    @patch.object(volume.VolumeDevice, 'migrate_data', return_value=None)
    @patch.object(volume.VolumeDevice, 'format', return_value=None)
    @patch.object(MongoDBApp, 'clear_storage')
    @patch.object(MongoDBApp, 'start_db')
    @patch.object(MongoDBApp, 'stop_db')
    @patch.object(MongoDBApp, 'install_if_needed')
    @patch.object(mongo_service.MongoDbAppStatus, 'begin_install')
    def _prepare_method(self, instance_id, instance_type, *args):
        cluster_config = {
            "id": instance_id,
            "shard_id": "test_shard_id",
            "instance_type": instance_type,
            "replica_set_name": "rs1"
        }

        # invocation
        self.manager.prepare(context=self.context,
                             databases=None,
                             packages=['package'],
                             memory_mb='2048',
                             users=None,
                             mount_point='/var/lib/mongodb',
                             overrides=None,
                             cluster_config=cluster_config)