Cannot change locations on immutable images
This change extends immutability to the contents of image locations. Change-Id: I5bfe9b73733eb92e0d27bd0222f6ad1a89ce5d78
This commit is contained in:
parent
37ef3c6875
commit
8cc4b45dbf
|
@ -180,6 +180,27 @@ def _immutable_attr(target, attr, proxy=None):
|
|||
return property(get_attr, forbidden, forbidden)
|
||||
|
||||
|
||||
class ImmutableLocations(list):
|
||||
def forbidden(self, *args, **kwargs):
|
||||
message = _("You are not permitted to modify locations "
|
||||
"for this image.")
|
||||
raise exception.Forbidden(message)
|
||||
|
||||
append = forbidden
|
||||
extend = forbidden
|
||||
insert = forbidden
|
||||
pop = forbidden
|
||||
remove = forbidden
|
||||
reverse = forbidden
|
||||
sort = forbidden
|
||||
__delitem__ = forbidden
|
||||
__delslice__ = forbidden
|
||||
__iadd__ = forbidden
|
||||
__imul__ = forbidden
|
||||
__setitem__ = forbidden
|
||||
__setslice__ = forbidden
|
||||
|
||||
|
||||
class ImmutableProperties(dict):
|
||||
def forbidden_key(self, key, *args, **kwargs):
|
||||
message = _("You are not permitted to modify '%s' on this image.")
|
||||
|
@ -227,7 +248,7 @@ class ImmutableImageProxy(object):
|
|||
min_disk = _immutable_attr('base', 'min_disk')
|
||||
min_ram = _immutable_attr('base', 'min_ram')
|
||||
protected = _immutable_attr('base', 'protected')
|
||||
locations = _immutable_attr('base', 'locations')
|
||||
locations = _immutable_attr('base', 'locations', proxy=ImmutableLocations)
|
||||
checksum = _immutable_attr('base', 'checksum')
|
||||
owner = _immutable_attr('base', 'owner')
|
||||
disk_format = _immutable_attr('base', 'disk_format')
|
||||
|
|
|
@ -641,6 +641,33 @@ class TestImmutableImage(utils.BaseTestCase):
|
|||
|
||||
def test_change_locations(self):
|
||||
self._test_change('locations', ['http://a/b/c'])
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.append, 'http://a/b/c')
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.extend, ['http://a/b/c'])
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.insert, 'foo')
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.pop)
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.remove, 'foo')
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.reverse)
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.sort)
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.__delitem__, 0)
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.__delslice__, 0, 2)
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.__setitem__, 0, 'foo')
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.__setslice__,
|
||||
0, 2, ['foo', 'bar'])
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.__iadd__, 'foo')
|
||||
self.assertRaises(exception.Forbidden,
|
||||
self.image.locations.__imul__, 2)
|
||||
|
||||
def test_change_size(self):
|
||||
self._test_change('size', 32)
|
||||
|
|
Loading…
Reference in New Issue