From cf8613e76d4682c924a900a17b43197d569d7ad3 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Mon, 9 Jul 2012 15:39:29 -0700 Subject: [PATCH] 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 --- glanceclient/v1/images.py | 11 ++++++++++- glanceclient/v1/shell.py | 6 +++++- tests/v1/test_images.py | 6 ++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/glanceclient/v1/images.py b/glanceclient/v1/images.py index ad8b43a4..5bee3597 100644 --- a/glanceclient/v1/images.py +++ b/glanceclient/v1/images.py @@ -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 diff --git a/glanceclient/v1/shell.py b/glanceclient/v1/shell.py index b4289755..fdd8d80f 100644 --- a/glanceclient/v1/shell.py +++ b/glanceclient/v1/shell.py @@ -170,6 +170,10 @@ def do_image_create(gc, args): @utils.arg('--property', metavar="", 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) diff --git a/tests/v1/test_images.py b/tests/v1/test_images.py index fe90fdde..b3fe1281 100644 --- a/tests/v1/test_images.py +++ b/tests/v1/test_images.py @@ -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):