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:
@@ -176,6 +176,15 @@ class ImageManager(base.Manager):
|
|||||||
else:
|
else:
|
||||||
image_data = None
|
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 = {}
|
fields = {}
|
||||||
for field in kwargs:
|
for field in kwargs:
|
||||||
if field in UPDATE_PARAMS:
|
if field in UPDATE_PARAMS:
|
||||||
@@ -185,7 +194,7 @@ class ImageManager(base.Manager):
|
|||||||
raise TypeError(msg % field)
|
raise TypeError(msg % field)
|
||||||
|
|
||||||
copy_from = fields.pop('copy_from', None)
|
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:
|
if copy_from is not None:
|
||||||
hdrs['x-glance-api-copy-from'] = copy_from
|
hdrs['x-glance-api-copy-from'] = copy_from
|
||||||
|
|
||||||
|
@@ -170,6 +170,10 @@ def do_image_create(gc, args):
|
|||||||
@utils.arg('--property', metavar="<key=value>", action='append', default=[],
|
@utils.arg('--property', metavar="<key=value>", action='append', default=[],
|
||||||
help=("Arbitrary property to associate with image. "
|
help=("Arbitrary property to associate with image. "
|
||||||
"May be used multiple times."))
|
"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):
|
def do_image_update(gc, args):
|
||||||
# Filter out None values
|
# Filter out None values
|
||||||
fields = dict(filter(lambda x: x[1] is not None, vars(args).items()))
|
fields = dict(filter(lambda x: x[1] is not None, vars(args).items()))
|
||||||
@@ -192,7 +196,7 @@ def do_image_update(gc, args):
|
|||||||
else:
|
else:
|
||||||
fields['data'] = sys.stdin
|
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)
|
_image_show(image)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -224,6 +224,12 @@ class ImageManagerTest(unittest.TestCase):
|
|||||||
expect = [('PUT', '/v1/images/1', expect_headers, image_data)]
|
expect = [('PUT', '/v1/images/1', expect_headers, image_data)]
|
||||||
self.assertEqual(self.api.calls, expect)
|
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):
|
class ImageTest(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
Reference in New Issue
Block a user