Skip to content

Commit

Permalink
Turn db model object into a primitive object to avoid error
Browse files Browse the repository at this point in the history
In volume API controller we need turn db model object into a primitive
object to avoid error when it adding visible administrator metadata to
volume's metadata dict.

Fixes bug: 1220232

Change-Id: I5f6c4fc8dd6ca3af02db577b37dcaeee92bb42e5
Signed-off-by: Zhi Yan Liu <zhiyanl@cn.ibm.com>
  • Loading branch information
Zhi Yan Liu committed Sep 12, 2013
1 parent d3dde4e commit fbbf79f
Show file tree
Hide file tree
Showing 5 changed files with 493 additions and 13 deletions.
15 changes: 12 additions & 3 deletions cinder/api/v1/volumes.py
Expand Up @@ -222,8 +222,14 @@ def _add_visible_admin_metadata(self, context, volume):

visible_admin_meta = {}

volume_tmp = (volume if context.is_admin else
self.volume_api.get(context.elevated(), volume['id']))
if context.is_admin:
volume_tmp = volume
else:
try:
volume_tmp = self.volume_api.get(context.elevated(),
volume['id'])
except Exception:
return

if volume_tmp.get('volume_admin_metadata'):
for item in volume_tmp['volume_admin_metadata']:
Expand All @@ -242,12 +248,13 @@ def _add_visible_admin_metadata(self, context, volume):
# NOTE(zhiyan): update visible administration metadata to
# volume metadata, administration metadata will rewrite existing key.
if volume.get('volume_metadata'):
orig_meta = volume.get('volume_metadata')
orig_meta = list(volume.get('volume_metadata'))
for item in orig_meta:
if item['key'] in visible_admin_meta.keys():
item['value'] = visible_admin_meta.pop(item['key'])
for key, value in visible_admin_meta.iteritems():
orig_meta.append({'key': key, 'value': value})
volume['volume_metadata'] = orig_meta
# avoid circular ref when vol is a Volume instance
elif (volume.get('metadata') and
isinstance(volume.get('metadata'), dict)):
Expand Down Expand Up @@ -311,6 +318,8 @@ def _items(self, req, entity_maker):
sort_key='created_at',
sort_dir='desc', filters=search_opts)

volumes = [dict(vol.iteritems()) for vol in volumes]

for volume in volumes:
self._add_visible_admin_metadata(context, volume)

Expand Down
15 changes: 12 additions & 3 deletions cinder/api/v2/volumes.py
Expand Up @@ -165,8 +165,14 @@ def _add_visible_admin_metadata(self, context, volume):

visible_admin_meta = {}

volume_tmp = (volume if context.is_admin else
self.volume_api.get(context.elevated(), volume['id']))
if context.is_admin:
volume_tmp = volume
else:
try:
volume_tmp = self.volume_api.get(context.elevated(),
volume['id'])
except Exception:
return

if volume_tmp.get('volume_admin_metadata'):
for item in volume_tmp['volume_admin_metadata']:
Expand All @@ -185,12 +191,13 @@ def _add_visible_admin_metadata(self, context, volume):
# NOTE(zhiyan): update visible administration metadata to
# volume metadata, administration metadata will rewrite existing key.
if volume.get('volume_metadata'):
orig_meta = volume.get('volume_metadata')
orig_meta = list(volume.get('volume_metadata'))
for item in orig_meta:
if item['key'] in visible_admin_meta.keys():
item['value'] = visible_admin_meta.pop(item['key'])
for key, value in visible_admin_meta.iteritems():
orig_meta.append({'key': key, 'value': value})
volume['volume_metadata'] = orig_meta
# avoid circular ref when vol is a Volume instance
elif (volume.get('metadata') and
isinstance(volume.get('metadata'), dict)):
Expand Down Expand Up @@ -267,6 +274,8 @@ def _get_volumes(self, req, is_detail):
volumes = self.volume_api.get_all(context, marker, limit, sort_key,
sort_dir, filters)

volumes = [dict(vol.iteritems()) for vol in volumes]

for volume in volumes:
self._add_visible_admin_metadata(context, volume)

Expand Down
2 changes: 2 additions & 0 deletions cinder/db/sqlalchemy/api.py
Expand Up @@ -1046,6 +1046,8 @@ def volume_create(context, values):
values['volume_admin_metadata'] = \
_metadata_refs(values.get('admin_metadata'),
models.VolumeAdminMetadata)
elif values.get('volume_admin_metadata'):
del values['volume_admin_metadata']

volume_ref = models.Volume()
if not values.get('id'):
Expand Down

0 comments on commit fbbf79f

Please sign in to comment.