Ejemplo n.º 1
0
 def drop(self):
     """
     Remove version control from a database.
     """
     if SQLA_07:
         try:
             self.table.drop()
         except sa_exceptions.DatabaseError:
             raise exceptions.DatabaseNotControlledError(str(self.table))
     else:
         try:
             self.table.drop()
         except (sa_exceptions.SQLError):
             raise exceptions.DatabaseNotControlledError(str(self.table))
Ejemplo n.º 2
0
 def test_db_version_init_race(self, mock_get_engine, mock_db_version,
         mock_find_repo):
     # This test exercises bug 1804652 by causing
     # versioning_api.version_contro() to raise an unhandleable error the
     # first time it is called.
     database = 'api'
     mock_get_engine.return_value = 'engine'
     exc = versioning_exceptions.DatabaseNotControlledError()
     mock_db_version.side_effect = [exc, '']
     metadata = mock.MagicMock()
     metadata.tables.return_value = []
     with mock.patch.object(sqlalchemy, 'MetaData',
             metadata), mock.patch.object(migration,
                     'db_version_control') as mock_version_control:
         # db_version_control raises an unhandleable error because we were
         # racing to initialise with another process.
         mock_version_control.side_effect = test.TestingException
         migration.db_version(database)
         mock_version_control.assert_called_once_with(0,
                                                      database,
                                                      context=None)
         db_version_calls = [mock.call('engine', 'repo')] * 2
         self.assertEqual(db_version_calls, mock_db_version.call_args_list)
     engine_calls = [mock.call(database, context=None)] * 3
     self.assertEqual(engine_calls, mock_get_engine.call_args_list)
Ejemplo n.º 3
0
    def test__is_database_under_migrate_control__false(self, mock_db_version):
        mock_db_version.side_effect = \
            migrate_exceptions.DatabaseNotControlledError()

        ret = migration._is_database_under_migrate_control('engine', 'repo')
        self.assertFalse(ret)

        mock_db_version.assert_called_once_with('engine', 'repo')
Ejemplo n.º 4
0
    def test_db_version_raise_not_controlled_error_tables(self):
        with mock.patch.object(sqlalchemy, 'MetaData') as mock_meta:
            self.mock_api_db_version.side_effect = \
                migrate_exception.DatabaseNotControlledError('oups')
            my_meta = mock.MagicMock()
            my_meta.tables = {'a': 1, 'b': 2}
            mock_meta.return_value = my_meta

            self.assertRaises(db_exception.DbMigrationError,
                              migration.db_version, self.engine, self.path,
                              self.init_version)
Ejemplo n.º 5
0
    def test_db_version_raise_not_controlled_error_no_tables(self, mock_vc):
        with mock.patch.object(sqlalchemy, 'MetaData') as mock_meta:
            self.mock_api_db_version.side_effect = (
                migrate_exception.DatabaseNotControlledError('oups'),
                self.init_version)
            my_meta = mock.MagicMock()
            my_meta.tables = {}
            mock_meta.return_value = my_meta
            migration.db_version(self.engine, self.path, self.init_version)

            mock_vc.assert_called_once_with(self.engine, self.return_value1,
                                            self.init_version)
Ejemplo n.º 6
0
    def test_db_version_raise_not_controlled_error_first(self):
        with mock.patch.object(migration, 'db_version_control') as mock_ver:

            self.mock_api_db_version.side_effect = [
                migrate_exception.DatabaseNotControlledError('oups'),
                self.test_version]

            ret_val = migration.db_version(self.engine, self.path,
                                           self.init_version)
            self.assertEqual(self.test_version, ret_val)
            mock_ver.assert_called_once_with(self.engine, self.path,
                                             version=self.init_version)
Ejemplo n.º 7
0
    def test_db_version_raise_not_controlled_migrate_tables(self, mock_vc):
        # When there are tables but the sqlalchemy-migrate control table
        # (migrate_version) is present, attempt to version the db.
        # This simulates the case where there is are multiple repos (different
        # abs_paths) and a different path has been versioned already.
        with mock.patch.object(sqlalchemy, 'MetaData') as mock_meta:
            self.mock_api_db_version.side_effect = [
                migrate_exception.DatabaseNotControlledError('oups'), None]
            my_meta = mock.MagicMock()
            my_meta.tables = {'migrate_version': 1, 'b': 2}
            mock_meta.return_value = my_meta

            migration.db_version(self.engine, self.path, self.init_version)

            mock_vc.assert_called_once_with(self.engine, self.return_value1,
                                            self.init_version)
 def test_not_controlled(self, mock_get_engine, mock_db_version,
                         mock_find_repo):
     database = 'api'
     mock_get_engine.side_effect = ['engine', 'engine', 'engine']
     exc = versioning_exceptions.DatabaseNotControlledError()
     mock_db_version.side_effect = [exc, '']
     metadata = mock.MagicMock()
     metadata.tables.return_value = []
     with mock.patch.object(
             sqlalchemy, 'MetaData', metadata), mock.patch.object(
                 migration, 'db_version_control') as mock_version_control:
         migration.db_version(database)
         mock_version_control.assert_called_once_with(0, database)
         db_version_calls = [mock.call('engine', 'repo')] * 2
         self.assertEqual(db_version_calls, mock_db_version.call_args_list)
     engine_calls = [mock.call(database)] * 3
     self.assertEqual(engine_calls, mock_get_engine.call_args_list)
Ejemplo n.º 9
0
    def load(self):
        """Load controlled schema version info from DB"""
        tname = self.repository.version_table
        try:
            if not hasattr(self, 'table') or self.table is None:
                self.table = Table(tname, self.meta, autoload=True)

            result = self.engine.execute(
                self.table.select(
                    self.table.c.repository_id == str(self.repository.id)))

            data = list(result)[0]
        except:
            cls, exc, tb = sys.exc_info()
            six.reraise(exceptions.DatabaseNotControlledError,
                        exceptions.DatabaseNotControlledError(str(exc)), tb)

        self.version = data['version']
        return data