Correct gb,snapshot quota update in group snapshot
Currently we are incrementing gigabytes quota twice, once while creating snapshot & then while creating individual volumes & this is fixed in this change. Also, snapshot quota updation was put in a loop of volumes because of which it gets incremented to number of volume times. Change-Id: I9ef79a21c7438e69221a5ed2a1c1bfb59f3f9a32 Closes-Bug: 1728834
This commit is contained in:
parent
3a896f265c
commit
b3669fa67c
@ -37,6 +37,7 @@ from cinder import quota_utils
|
||||
from cinder import test
|
||||
from cinder.tests.unit import fake_constants as fake
|
||||
import cinder.tests.unit.image.fake
|
||||
from cinder.tests.unit import utils as tests_utils
|
||||
from cinder import volume
|
||||
|
||||
|
||||
@ -158,6 +159,25 @@ class QuotaIntegrationTestCase(test.TestCase):
|
||||
self.assertEqual(msg, six.text_type(ex))
|
||||
vol_ref.destroy()
|
||||
|
||||
def test__snapshots_quota_value(self):
|
||||
test_volume1 = tests_utils.create_volume(
|
||||
self.context,
|
||||
status='available',
|
||||
host=CONF.host)
|
||||
test_volume2 = tests_utils.create_volume(
|
||||
self.context,
|
||||
status='available',
|
||||
host=CONF.host)
|
||||
volume_api = cinder.volume.api.API()
|
||||
volume_api.create_snapshots_in_db(self.context,
|
||||
[test_volume1, test_volume2],
|
||||
'fake_name',
|
||||
'fake_description',
|
||||
fake.CONSISTENCY_GROUP_ID)
|
||||
usages = db.quota_usage_get_all_by_project(self.context,
|
||||
self.project_id)
|
||||
self.assertEqual(1, usages['snapshots']['in_use'])
|
||||
|
||||
def test_too_many_snapshots_of_type(self):
|
||||
resource = 'snapshots_%s' % self.volume_type_name
|
||||
db.quota_class_create(self.context, 'default', resource, 1)
|
||||
|
@ -89,6 +89,7 @@ def create_volume(ctxt,
|
||||
vol['consistencygroup_id'] = consistencygroup_id
|
||||
if group_id:
|
||||
vol['group_id'] = group_id
|
||||
vol['group_snapshot'] = None
|
||||
if volume_type_id:
|
||||
vol['volume_type_id'] = volume_type_id
|
||||
if metadata:
|
||||
|
@ -191,7 +191,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
self.assertEqual(replication_status, result['replication_status'],
|
||||
extra_specs)
|
||||
|
||||
@ -236,7 +237,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
fake_get_encryption_key.assert_called_once_with(
|
||||
fake_key_manager, self.ctxt, fakes.VOLUME_TYPE_ID,
|
||||
None, None, image_meta)
|
||||
@ -280,7 +282,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
expected_result = {'size': 1,
|
||||
'snapshot_id': None,
|
||||
'source_volid': None,
|
||||
@ -336,7 +339,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
|
||||
@mock.patch('cinder.volume.volume_types.is_encrypted')
|
||||
@mock.patch('cinder.volume.volume_types.get_volume_type_qos_specs')
|
||||
@ -379,7 +383,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
expected_result = {'size': 1,
|
||||
'snapshot_id': None,
|
||||
'source_volid': None,
|
||||
@ -442,7 +447,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
|
||||
mock_is_encrypted.assert_called_once_with(self.ctxt, 1)
|
||||
mock_get_volume_type_encryption.assert_called_once_with(self.ctxt, 1)
|
||||
@ -485,7 +491,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
expected_result = {'size': (sys.maxsize + 1),
|
||||
'snapshot_id': None,
|
||||
'source_volid': None,
|
||||
@ -541,7 +548,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
expected_result = {'size': 1,
|
||||
'snapshot_id': None,
|
||||
'source_volid': None,
|
||||
@ -604,7 +612,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
expected_result = {'size': 1,
|
||||
'snapshot_id': None,
|
||||
'source_volid': None,
|
||||
@ -668,7 +677,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
expected_result = {'size': 1,
|
||||
'snapshot_id': None,
|
||||
'source_volid': None,
|
||||
@ -731,7 +741,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
expected_result = {'size': 1,
|
||||
'snapshot_id': None,
|
||||
'source_volid': None,
|
||||
@ -792,7 +803,8 @@ class CreateVolumeFlowTestCase(test.TestCase):
|
||||
key_manager=fake_key_manager,
|
||||
consistencygroup=None,
|
||||
cgsnapshot=None,
|
||||
group=None)
|
||||
group=None,
|
||||
group_snapshot=None)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
|
@ -109,6 +109,7 @@ class ManageVolumeFlowTestCase(test.TestCase):
|
||||
'context': mock.sentinel.context,
|
||||
'volume': mock.sentinel.volume,
|
||||
'manage_existing_ref': mock.sentinel.ref,
|
||||
'group_snapshot': None,
|
||||
'optional_args': {'is_quota_committed': False},
|
||||
}
|
||||
|
||||
@ -135,6 +136,7 @@ class ManageVolumeFlowTestCase(test.TestCase):
|
||||
'context',
|
||||
'volume',
|
||||
'manage_existing_ref',
|
||||
'group_snapshot',
|
||||
'optional_args',
|
||||
]
|
||||
|
||||
|
@ -959,12 +959,10 @@ class API(base.Base):
|
||||
reserve_opts_list = []
|
||||
total_reserve_opts = {}
|
||||
try:
|
||||
reserve_opts_list.append({'snapshots': 1})
|
||||
for volume in volume_list:
|
||||
if CONF.no_snapshot_gb_quota:
|
||||
reserve_opts = {'snapshots': 1}
|
||||
else:
|
||||
reserve_opts = {'snapshots': 1,
|
||||
'gigabytes': volume['size']}
|
||||
if not CONF.no_snapshot_gb_quota:
|
||||
reserve_opts = {'gigabytes': volume['size']}
|
||||
QUOTAS.add_volume_type_opts(context,
|
||||
reserve_opts,
|
||||
volume.get('volume_type_id'))
|
||||
|
@ -414,7 +414,7 @@ class ExtractVolumeRequestTask(flow_utils.CinderTask):
|
||||
|
||||
def execute(self, context, size, snapshot, image_id, source_volume,
|
||||
availability_zone, volume_type, metadata, key_manager,
|
||||
consistencygroup, cgsnapshot, group):
|
||||
consistencygroup, cgsnapshot, group, group_snapshot):
|
||||
|
||||
utils.check_exclusive_options(snapshot=snapshot,
|
||||
imageRef=image_id,
|
||||
@ -615,7 +615,8 @@ class QuotaReserveTask(flow_utils.CinderTask):
|
||||
def __init__(self):
|
||||
super(QuotaReserveTask, self).__init__(addons=[ACTION])
|
||||
|
||||
def execute(self, context, size, volume_type_id, optional_args):
|
||||
def execute(self, context, size, volume_type_id, group_snapshot,
|
||||
optional_args):
|
||||
try:
|
||||
values = {'per_volume_gigabytes': size}
|
||||
QUOTAS.limit_check(context, project_id=context.project_id,
|
||||
@ -626,6 +627,9 @@ class QuotaReserveTask(flow_utils.CinderTask):
|
||||
size=size, limit=quotas['per_volume_gigabytes'])
|
||||
|
||||
try:
|
||||
if group_snapshot:
|
||||
reserve_opts = {'volumes': 1}
|
||||
else:
|
||||
reserve_opts = {'volumes': 1, 'gigabytes': size}
|
||||
QUOTAS.add_volume_type_opts(context, reserve_opts, volume_type_id)
|
||||
reservations = QUOTAS.reserve(context, **reserve_opts)
|
||||
|
@ -117,6 +117,7 @@ def get_flow(context, db, driver, host, volume, ref):
|
||||
'context': context,
|
||||
'volume': volume,
|
||||
'manage_existing_ref': ref,
|
||||
'group_snapshot': None,
|
||||
'optional_args': {'is_quota_committed': False},
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user