Merge "Add volume size verify for replica based on master"

This commit is contained in:
Zuul 2017-11-14 16:09:19 +00:00 committed by Gerrit Code Review
commit e94dcce00d
5 changed files with 28 additions and 8 deletions

View File

@ -286,6 +286,10 @@ common_opts = [
help='Enable verification of Swift checksum before starting '
'restore. Makes sure the checksum of original backup matches '
'the checksum of the Swift backup file.'),
cfg.BoolOpt('verify_replica_volume_size', default=True,
help='Require the replica volume size to be greater than '
'or equal to the size of the master volume '
'during replica creation.'),
cfg.StrOpt('storage_strategy', default='SwiftStorage',
help="Default strategy to store backups."),
cfg.StrOpt('storage_namespace',

View File

@ -955,6 +955,14 @@ class Instance(BuiltInstance):
raise exception.Forbidden(
_("Cannot create a replica of a replica %(id)s.")
% {'id': slave_of_id})
if (CONF.verify_replica_volume_size
and replica_source.volume_size > volume_size):
raise exception.Forbidden(
_("Replica volume size should not be smaller than"
" master's, replica volume size: %(replica_size)s"
" and master volume size: %(master_size)s.")
% {'replica_size': volume_size,
'master_size': replica_source.volume_size})
# load the replica source status to check if
# source is available
load_simple_instance_server_status(

View File

@ -681,7 +681,7 @@ class CreateInstance(object):
instance_info.dbaas_datastore = CONFIG.dbaas_datastore
instance_info.dbaas_datastore_version = CONFIG.dbaas_datastore_version
if VOLUME_SUPPORT:
instance_info.volume = {'size': CONFIG.get('trove_volume_size', 1)}
instance_info.volume = {'size': CONFIG.get('trove_volume_size', 2)}
else:
instance_info.volume = None

View File

@ -91,7 +91,7 @@ def create_slave():
result = instance_info.dbaas.instances.create(
instance_info.name + "_slave",
instance_info.dbaas_flavor_href,
instance_info.volume,
{'size': 2},
datastore=instance_info.dbaas_datastore,
datastore_version=instance_info.dbaas_datastore_version,
nics=instance_info.nics,

View File

@ -351,7 +351,8 @@ class TestReplication(trove_testtools.TestCase):
InstanceTasks.NONE,
id=str(uuid.uuid4()),
name="TestMasterInstance",
datastore_version_id=self.datastore_version.id)
datastore_version_id=self.datastore_version.id,
volume_size=2)
self.master.set_task_status(InstanceTasks.NONE)
self.master.save()
self.master_status = InstanceServiceStatus(
@ -381,7 +382,7 @@ class TestReplication(trove_testtools.TestCase):
self.assertRaises(exception.UnprocessableEntity,
Instance.create,
None, 'name', 1, "UUID", [], [], self.datastore,
self.datastore_version, 1,
self.datastore_version, 2,
None, slave_of_id=self.master.id)
@patch('trove.instance.models.LOG')
@ -389,7 +390,7 @@ class TestReplication(trove_testtools.TestCase):
self.assertRaises(exception.NotFound,
Instance.create,
None, 'name', 1, "UUID", [], [], self.datastore,
self.datastore_version, 1,
self.datastore_version, 2,
None, slave_of_id=str(uuid.uuid4()))
def test_create_replica_from_replica(self):
@ -406,13 +407,13 @@ class TestReplication(trove_testtools.TestCase):
self.replica_info.save()
self.assertRaises(exception.Forbidden, Instance.create,
None, 'name', 2, "UUID", [], [], self.datastore,
self.datastore_version, 1,
self.datastore_version, 2,
None, slave_of_id=self.replica_info.id)
def test_create_replica_with_users(self):
self.users.append({"name": "testuser", "password": "123456"})
self.assertRaises(exception.ReplicaCreateWithUsersDatabasesError,
Instance.create, None, 'name', 1, "UUID", [],
Instance.create, None, 'name', 2, "UUID", [],
self.users, self.datastore, self.datastore_version,
1, None, slave_of_id=self.master.id)
@ -421,9 +422,16 @@ class TestReplication(trove_testtools.TestCase):
self.assertRaises(exception.ReplicaCreateWithUsersDatabasesError,
Instance.create, None, 'name', 1, "UUID",
self.databases, [], self.datastore,
self.datastore_version, 1, None,
self.datastore_version, 2, None,
slave_of_id=self.master.id)
def test_replica_volume_size_smaller_than_master(self):
self.assertRaises(exception.Forbidden,
Instance.create,
None, 'name', 1, "UUID", [], [], self.datastore,
self.datastore_version, 1,
None, slave_of_id=self.master.id)
def trivial_key_function(id):
return id * id