diff --git a/glanceclient/v1/images.py b/glanceclient/v1/images.py index ad8b43a..5bee359 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 b428975..fdd8d80 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 fe90fdd..b3fe128 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):