notifier_api.notify(context, 'volumeType',
'volume_type.delete',
notifier_api.INFO, notifier_info)
+ except exception.VolumeTypeInUse as err:
+ notifier_err = dict(id=id, error_message=str(err))
+ self._notify_voloume_type_error(context,
+ 'volume_type.delete',
+ notifier_err)
+ msg = 'Target volume type is still in use.'
+ raise webob.exc.HTTPBadRequest(explanation=msg)
except exception.NotFound as err:
notifier_err = dict(id=id, error_message=str(err))
self._notify_voloume_type_error(context,
session = get_session()
with session.begin():
_volume_type_get(context, id, session)
-
+ results = model_query(context, models.Volume, session=session). \
+ filter_by(volume_type_id=id).all()
+ if results:
+ msg = _('VolumeType %s deletion failed, VolumeType in use.') % id
+ LOG.error(msg)
+ raise exception.VolumeTypeInUse(volume_type_id=id)
session.query(models.VolumeTypes).\
filter_by(id=id).\
update({'deleted': True,
"key %(extra_specs_key)s.")
+class VolumeTypeInUse(CinderException):
+ message = _("Volume Type %(volume_type_id)s deletion is not allowed with "
+ "volumes present with the type.")
+
+
class SnapshotNotFound(NotFound):
message = _("Snapshot %(snapshot_id)s could not be found.")
pass
+def return_volume_types_with_volumes_destroy(context, id):
+ if id == "1":
+ raise exception.VolumeTypeInUse(volume_type_id=id)
+ pass
+
+
def return_volume_types_create(context, name, specs):
pass
req, '777')
self.assertEquals(len(test_notifier.NOTIFICATIONS), 1)
+ def test_volume_types_with_volumes_destroy(self):
+ self.stubs.Set(volume_types, 'get_volume_type',
+ return_volume_types_get_volume_type)
+ self.stubs.Set(volume_types, 'destroy',
+ return_volume_types_with_volumes_destroy)
+ req = fakes.HTTPRequest.blank('/v2/fake/types/1')
+ self.assertEquals(len(test_notifier.NOTIFICATIONS), 0)
+ self.controller._delete(req, 1)
+ self.assertEquals(len(test_notifier.NOTIFICATIONS), 1)
+
def test_create(self):
self.stubs.Set(volume_types, 'create',
return_volume_types_create)
"""
+import datetime
import time
from cinder import context
+from cinder import db
from cinder.db.sqlalchemy import api as db_api
from cinder.db.sqlalchemy import models
from cinder import exception
self.assertRaises(exception.VolumeTypeNotFound,
volume_types.destroy, self.ctxt, "sfsfsdfdfs")
+ def test_volume_type_with_volumes_shouldnt_delete(self):
+ """Ensures volume type deletion with associated volumes fail."""
+ type_ref = volume_types.create(self.ctxt, self.vol_type1_name)
+ db.volume_create(self.ctxt,
+ {'id': '1',
+ 'updated_at': datetime.datetime(1, 1, 1, 1, 1, 1),
+ 'display_description': 'Test Desc',
+ 'size': 20,
+ 'status': 'available',
+ 'volume_type_id': type_ref['id']})
+ self.assertRaises(exception.VolumeTypeInUse,
+ volume_types.destroy, self.ctxt, type_ref['id'])
+
def test_repeated_vol_types_shouldnt_raise(self):
"""Ensures that volume duplicates don't raise."""
new_name = self.vol_type1_name + "dup"