bb260949d4
hacking 3.1.0 is too old. Note: We can't directly bump hacking to 6.x.0 (which is the latest major version) because of the existing cap by diskimage-builder. The cap is now being updated by [1]. [1] https://review.opendev.org/c/openstack/diskimage-builder/+/909336 Change-Id: I8778a7decc6669b4d95d6886c971433e7c34c5c8
197 lines
6.8 KiB
Python
197 lines
6.8 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
|
|
import unittest
|
|
from unittest.mock import MagicMock, Mock, PropertyMock, patch
|
|
|
|
from oslo_config import cfg
|
|
from oslo_log import log as logging
|
|
from oslo_utils import importutils
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
CONF = cfg.CONF
|
|
CONF.backup_encryption_key = None
|
|
CONF.backup_id = "backup_unittest"
|
|
CONF.db_user = "db_user"
|
|
CONF.db_password = "db_password"
|
|
CONF.db_host = "db_host"
|
|
|
|
driver_mapping = {
|
|
'innobackupex': 'backup.drivers.innobackupex.InnoBackupEx',
|
|
'innobackupex_inc': 'backup.drivers.innobackupex.InnoBackupExIncremental',
|
|
'mariabackup': 'backup.drivers.mariabackup.MariaBackup',
|
|
'mariabackup_inc': 'backup.drivers.mariabackup.MariaBackupIncremental',
|
|
'pg_basebackup': 'backup.drivers.postgres.PgBasebackup',
|
|
'pg_basebackup_inc': 'backup.drivers.postgres.PgBasebackupIncremental',
|
|
'xtrabackup': 'backup.drivers.xtrabackup.XtraBackup',
|
|
'xtrabackup_inc': 'backup.drivers.xtrabackup.XtraBackupIncremental'
|
|
}
|
|
|
|
from backup.drivers.xtrabackup import XtraBackupException
|
|
|
|
|
|
class TestXtraBackup(unittest.TestCase):
|
|
def setUp(self):
|
|
self.runner_cls = importutils.import_class(
|
|
driver_mapping['xtrabackup'])
|
|
self.params = {
|
|
'db_datadir': '/var/lib/mysql/data'
|
|
}
|
|
# assertions
|
|
self.assertIsNotNone(self.runner_cls)
|
|
|
|
def tearDown(self):
|
|
pass
|
|
|
|
def test_instance(self):
|
|
'''Check instance'''
|
|
# call the method
|
|
runner = self.runner_cls(**self.params)
|
|
|
|
# assertions
|
|
self.assertIsNotNone(runner)
|
|
|
|
def test_cmd(self):
|
|
'''Check cmd property'''
|
|
# call the method
|
|
runner = self.runner_cls(**self.params)
|
|
|
|
# assertions
|
|
cmd = ('xtrabackup --backup --stream=xbstream --parallel=2 '
|
|
'--datadir=%(datadir)s --user=%(user)s '
|
|
'--password=%(password)s --host=%(host)s'
|
|
% {
|
|
'datadir': runner.datadir,
|
|
'user': CONF.db_user,
|
|
'password': CONF.db_password,
|
|
'host': CONF.db_host}
|
|
)
|
|
self.assertEqual(runner.cmd, cmd)
|
|
|
|
def test_check_restore_process(self):
|
|
'''Check manifest'''
|
|
# call the method
|
|
runner = self.runner_cls(**self.params)
|
|
runner.process = MagicMock()
|
|
returncode = PropertyMock(return_value=0)
|
|
type(runner.process).returncode = returncode
|
|
|
|
# assertions
|
|
self.assertEqual(runner.check_restore_process(), True)
|
|
|
|
def test_post_restore(self):
|
|
'''Check manifest'''
|
|
runner = self.runner_cls(**self.params)
|
|
mock = Mock(side_effect=XtraBackupException(
|
|
'Prepare did not complete successfully'))
|
|
runner.post_restore = mock
|
|
|
|
# call the method
|
|
with self.assertRaises(
|
|
XtraBackupException,
|
|
msg="Prepare did not complete successfully"):
|
|
runner.post_restore()
|
|
|
|
|
|
# Manually import XtraBackupIncremental to prevent from running
|
|
# xtrabackup --version when calling the TestXtraBackupIncremental
|
|
# constructor
|
|
from backup.drivers.xtrabackup import XtraBackupIncremental
|
|
|
|
|
|
class TestXtraBackupIncremental(unittest.TestCase):
|
|
def setUp(self):
|
|
self.runner_cls = importutils.import_class(
|
|
driver_mapping['xtrabackup_inc'])
|
|
self.params = {
|
|
'lsn': '1234567890',
|
|
'parent_location': '',
|
|
'parent_checksum': '',
|
|
}
|
|
self.metadata = {
|
|
'lsn': '1234567890',
|
|
'parent_location': 'https://example.com/location',
|
|
'parent_checksum': 'f1508ecf362a364c5aae008b4b5a9cb9',
|
|
}
|
|
|
|
def tearDown(self):
|
|
pass
|
|
|
|
def test_instance(self):
|
|
'''Check instance and add_incremental_opts'''
|
|
# call the method
|
|
with patch(
|
|
'backup.drivers.xtrabackup.XtraBackupIncremental.'
|
|
'add_incremental_opts', new_callable=PropertyMock
|
|
) as XtraBackupIncremental_add_incremental_opts:
|
|
XtraBackupIncremental_add_incremental_opts.return_value = True
|
|
runner = XtraBackupIncremental(**self.params)
|
|
# assertions
|
|
self.assertIsNotNone(runner)
|
|
|
|
def test_cmd(self):
|
|
'''Check cmd property'''
|
|
# call the method
|
|
with patch(
|
|
'backup.drivers.xtrabackup.XtraBackupIncremental.'
|
|
'add_incremental_opts', new_callable=PropertyMock
|
|
) as XtraBackupIncremental_add_incremental_opts:
|
|
XtraBackupIncremental_add_incremental_opts.return_value = True
|
|
runner = XtraBackupIncremental(**self.params)
|
|
|
|
# assertions
|
|
self.assertIsNotNone(runner)
|
|
# assertions
|
|
cmd = (f'xtrabackup --backup --stream=xbstream '
|
|
f'--incremental-lsn=%(lsn)s '
|
|
f'--datadir={runner.datadir} {runner.user_and_pass}')
|
|
if runner.add_incremental_opts:
|
|
cmd = '{} --incremental'.format(cmd)
|
|
self.assertEqual(runner.cmd, cmd)
|
|
|
|
def test_get_metadata(self):
|
|
'''Check get_metadata'''
|
|
with patch(
|
|
'backup.drivers.xtrabackup.XtraBackupIncremental.'
|
|
'add_incremental_opts', new_callable=PropertyMock
|
|
) as XtraBackupIncremental_add_incremental_opts:
|
|
XtraBackupIncremental_add_incremental_opts.return_value = True
|
|
runner = XtraBackupIncremental(**self.params)
|
|
runner.get_metadata = MagicMock(return_value=self.metadata)
|
|
|
|
# assertions
|
|
self.assertIsNotNone(runner)
|
|
ret = runner.get_metadata()
|
|
self.assertEqual(ret, self.metadata)
|
|
|
|
def test_run_restore(self):
|
|
'''Check run_restore'''
|
|
with patch(
|
|
'backup.drivers.xtrabackup.XtraBackupIncremental.'
|
|
'add_incremental_opts', new_callable=PropertyMock
|
|
) as XtraBackupIncremental_add_incremental_opts:
|
|
XtraBackupIncremental_add_incremental_opts.return_value = True
|
|
runner = XtraBackupIncremental(**self.params)
|
|
length = 10
|
|
runner.incremental_restore = MagicMock(return_value=length)
|
|
runner.restore_content_length = length
|
|
# call the method
|
|
ret = runner.run_restore()
|
|
# assertions
|
|
self.assertEqual(ret, length)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|