"""Get count and gigabytes used for snapshots for specified project."""
return IMPL.snapshot_data_get_for_project(context,
project_id,
- session=None)
+ session)
def snapshot_get_active_by_window(context, begin, end=None, project_id=None):
default=None,
help='A list of backend names to use. These backend names '
'should be backed by a unique [CONFIG] group '
- 'with its options'), ]
+ 'with its options'),
+ cfg.BoolOpt('no_snapshot_gb_quota',
+ default=False,
+ help='Whether snapshots count against GigaByte quota'), ]
FLAGS.register_opts(global_opts)
def _sync_snapshots(context, project_id, session):
return dict(zip(('snapshots', 'gigabytes'),
- db.volume_data_get_for_project(context,
- project_id,
- session=session)))
+ db.snapshot_data_get_for_project(context,
+ project_id,
+ session=session)))
QUOTAS = QuotaEngine()
vol['user_id'] = self.user_id
vol['project_id'] = self.project_id
vol['size'] = size
- return db.volume_create(self.context, vol)['id']
+ vol['status'] = 'available'
+ return db.volume_create(self.context, vol)
def test_too_many_volumes(self):
volume_ids = []
for i in range(FLAGS.quota_volumes):
- volume_id = self._create_volume()
- volume_ids.append(volume_id)
+ vol_ref = self._create_volume()
+ volume_ids.append(vol_ref['id'])
self.assertRaises(exception.QuotaError,
volume.API().create,
self.context, 10, '', '', None)
def test_too_many_gigabytes(self):
volume_ids = []
- volume_id = self._create_volume(size=20)
- volume_ids.append(volume_id)
+ vol_ref = self._create_volume(size=20)
+ volume_ids.append(vol_ref['id'])
self.assertRaises(exception.QuotaError,
volume.API().create,
self.context, 10, '', '', None)
raise exception.InvalidVolume(reason=msg)
try:
- reservations = QUOTAS.reserve(context, snapshots=1,
- gigabytes=volume['size'])
+ if FLAGS.no_snapshot_gb_quota:
+ reservations = QUOTAS.reserve(context, snapshots=1)
+ else:
+ reservations = QUOTAS.reserve(context, snapshots=1,
+ gigabytes=volume['size'])
except exception.OverQuota as e:
overs = e.kwargs['overs']
usages = e.kwargs['usages']
snapshot_ref['id'],
{'status': 'error_deleting'})
+ # Get reservations
+ try:
+ if CONF.no_snapshot_gb_quota:
+ reservations = QUOTAS.reserve(context, snapshots=-1)
+ else:
+ reservations = QUOTAS.reserve(
+ context,
+ snapshots=-1,
+ gigabytes=-snapshot_ref['volume_size'])
+ except Exception:
+ reservations = None
+ LOG.exception(_("Failed to update usages deleting snapshot"))
self.db.volume_glance_metadata_delete_by_snapshot(context, snapshot_id)
self.db.snapshot_destroy(context, snapshot_id)
LOG.info(_("snapshot %s: deleted successfully"), snapshot_ref['name'])
+
+ # Commit the reservations
+ if reservations:
+ QUOTAS.commit(context, reservations)
return True
def attach_volume(self, context, volume_id, instance_uuid, mountpoint):
# syslog facility to receive log lines (string value)
#syslog_log_facility=LOG_USER
+# Do not count snapshots against gigabytes quota (bool value)
+#no_snapshot_gb_quota=False
#
# Options defined in cinder.exception
#volume_driver=cinder.volume.driver.FakeISCSIDriver
-# Total option count: 254
+# Total option count: 255