Preserve image properties on update

* By default, image properties should not be deleted on image update.
* A user can specify --purge-props through the CLI or purge_props
  as a keyword argument to ImageManager.update to override the default
  behavior and force properties to be deleted.
* Fixes bug 1022758

Change-Id: Ib079378cb765552fc29a66913aefbbcd934d2065
This commit is contained in:
Brian Waldon 2012-07-09 15:39:29 -07:00
parent 0e8ab72357
commit cf8613e76d
3 changed files with 21 additions and 2 deletions

View File

@ -176,6 +176,15 @@ class ImageManager(base.Manager):
else:
image_data = None
hdrs = {}
try:
purge_props = 'true' if kwargs.pop('purge_props') else 'false'
except KeyError:
pass
else:
hdrs['x-glance-registry-purge-props'] = purge_props
fields = {}
for field in kwargs:
if field in UPDATE_PARAMS:
@ -185,7 +194,7 @@ class ImageManager(base.Manager):
raise TypeError(msg % field)
copy_from = fields.pop('copy_from', None)
hdrs = self._image_meta_to_headers(fields)
hdrs.update(self._image_meta_to_headers(fields))
if copy_from is not None:
hdrs['x-glance-api-copy-from'] = copy_from

View File

@ -170,6 +170,10 @@ def do_image_create(gc, args):
@utils.arg('--property', metavar="<key=value>", action='append', default=[],
help=("Arbitrary property to associate with image. "
"May be used multiple times."))
@utils.arg('--purge-props', action='store_true', default=False,
help=("If this flag is present, delete all image properties "
"not explicitly set in the update request. Otherwise, "
"those properties not referenced are preserved."))
def do_image_update(gc, args):
# Filter out None values
fields = dict(filter(lambda x: x[1] is not None, vars(args).items()))
@ -192,7 +196,7 @@ def do_image_update(gc, args):
else:
fields['data'] = sys.stdin
image = gc.images.update(image_id, **fields)
image = gc.images.update(image_id, purge_props=args.purge_props, **fields)
_image_show(image)

View File

@ -224,6 +224,12 @@ class ImageManagerTest(unittest.TestCase):
expect = [('PUT', '/v1/images/1', expect_headers, image_data)]
self.assertEqual(self.api.calls, expect)
def test_update_with_purge_props(self):
self.mgr.update('1', purge_props=True)
expect_headers = {'x-glance-registry-purge-props': 'true'}
expect = [('PUT', '/v1/images/1', expect_headers, None)]
self.assertEqual(self.api.calls, expect)
class ImageTest(unittest.TestCase):
def setUp(self):