From cabca4fd3046503bcd917eba0cdd400491ba89cd Mon Sep 17 00:00:00 2001 From: Jean-Baptiste RANSY Date: Sat, 30 Mar 2013 15:25:29 +0100 Subject: [PATCH] Prevent create volume from snapshot with bad size Prevent to create a volume from a snapshot with a volume size less than the snapshot size. Check if a volume size is specified that it is less than the snapshot size. Raise a exception if it's lesser. Fixes bug 1161841 Change-Id: Ic1afbfb025ce0b3906c35c6c50a71734d74a9851 --- cinder/tests/test_volume.py | 14 ++++++++++++++ cinder/volume/api.py | 5 ++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/cinder/tests/test_volume.py b/cinder/tests/test_volume.py index 5a06be538fe..b980206fb77 100644 --- a/cinder/tests/test_volume.py +++ b/cinder/tests/test_volume.py @@ -253,6 +253,20 @@ def test_create_volume_from_snapshot(self): self.volume.delete_snapshot(self.context, snapshot_id) self.volume.delete_volume(self.context, volume_src['id']) + def test_create_volume_from_snapshot_fail_bad_size(self): + """Test volume can't be created from snapshot with bad volume size.""" + volume_api = cinder.volume.api.API() + snapshot = dict(id=1234, + status='available', + volume_size=10) + self.assertRaises(exception.InvalidInput, + volume_api.create, + self.context, + size=1, + name='fake_name', + description='fake_desc', + snapshot=snapshot) + def test_create_volume_with_invalid_exclusive_options(self): """Test volume create with multiple exclusive options fails.""" volume_api = cinder.volume.api.API() diff --git a/cinder/volume/api.py b/cinder/volume/api.py index 995276748cb..93a05132462 100644 --- a/cinder/volume/api.py +++ b/cinder/volume/api.py @@ -104,7 +104,10 @@ def create(self, context, size, name, description, snapshot=None, raise exception.InvalidSnapshot(reason=msg) if not size: size = snapshot['volume_size'] - + elif size < snapshot['volume_size']: + msg = _("Volume size cannot be lesser than" + " the Snapshot size") + raise exception.InvalidInput(reason=msg) snapshot_id = snapshot['id'] else: snapshot_id = None