Custom properties are missing in the image details section.

This is due to the changes made to handle the
community change where V1 glance API got removed
with Queens release of openstack. And, with V2
the response format has changed returning fewer
properties.This bug is to fix the issue related
to missing  custom properties and add them back
to be displayed to the user.

Change-Id: I116ad05b00de6e94cf6c507dbcffa607b916fc42
Closes-Bug: #1814739
This commit is contained in:
Punith Kenchappa 2019-02-05 18:34:21 +05:30
parent 9980f8ee64
commit 4685d5fbc7
2 changed files with 72 additions and 15 deletions

View File

@ -1,4 +1,4 @@
# Copyright 2013, 2018 IBM Corp. # Copyright 2013, 2019 IBM Corp.
""" """
All PowerVC Driver ImageManager Constants All PowerVC Driver ImageManager Constants
@ -98,5 +98,11 @@ IMAGE_SYNC_CHECK_INTERVAL_TIME_IN_SECONDS = 1
# Block Device Mapping Key in image properties # Block Device Mapping Key in image properties
BDM_KEY = 'block_device_mapping' BDM_KEY = 'block_device_mapping'
# Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change
V1_PROPERTIES = ['os_distro', 'block_device_mapping', 'hypervisor_type', V1_PROPERTIES = ['os_distro', 'block_device_mapping', 'hypervisor_type',
'bdm_v2', 'architecture', 'endianness', 'root_device_name'] 'bdm_v2', 'architecture', 'endianness', 'vcpus',
'boot_roles', 'root_device_name', 'owner_id',
'owner_user_name', 'user_id', 'Euca2ools state',
'decision_id', 'disk_format', 'image_location', 'memory_mb',
'storage_connectivity_group_id', 'owner_project_name']

View File

@ -1,4 +1,4 @@
# Copyright 2013, 2018 IBM Corp. # Copyright 2013, 2019 IBM Corp.
""" """
PowerVC Driver ImageManager service PowerVC Driver ImageManager service
@ -604,12 +604,18 @@ class PowerVCImageManager(service.Service):
v2pvc_images) v2pvc_images)
if updated_image is None: if updated_image is None:
# Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change
if isinstance(pvc_image, dict):
pvc_image_name = pvc_image['name']
else:
pvc_image_name = pvc_image.name
LOG.error(_('PowerVC image \'%s\' with UUID %s was not' LOG.error(_('PowerVC image \'%s\' with UUID %s was not'
' updated during periodic image ' ' updated during periodic image '
'synchronization. It will be updated again' 'synchronization. It will be updated again'
' during the next periodic image ' ' during the next periodic image '
'synchronization operation.'), 'synchronization operation.'),
pvc_image.name, uuid) pvc_image_name, uuid)
else: else:
self.pvc_updated_count += 1 self.pvc_updated_count += 1
@ -617,6 +623,11 @@ class PowerVCImageManager(service.Service):
# next periodic sync operation. The update times are # next periodic sync operation. The update times are
# stored in a dict with the PowerVC UUID as the keys # stored in a dict with the PowerVC UUID as the keys
# and the updated_at image attribute as the values. # and the updated_at image attribute as the values.
# Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change
if isinstance(updated_image, dict):
self.pvc_updated_at[uuid] = updated_image['updated_at']
else:
self.pvc_updated_at[uuid] = updated_image.updated_at self.pvc_updated_at[uuid] = updated_image.updated_at
self.local_updated_at[uuid] = local_image.updated_at self.local_updated_at[uuid] = local_image.updated_at
@ -1892,9 +1903,12 @@ class PowerVCImageManager(service.Service):
# Adds are keys in the source that are not in the target # Adds are keys in the source that are not in the target
adds = src_prop_set.difference(tgt_prop_set) adds = src_prop_set.difference(tgt_prop_set)
# Deletes are keys in the target that are not in the source. # Deletes are keys in the target that are not in the source.
deletes = tgt_prop_set.difference(src_prop_set) # Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change. Skip deleting the keys
# that are not in the source.
# deletes = tgt_prop_set.difference(src_prop_set)
deletes = None
# Get the adds and updates # Get the adds and updates
for key in adds: for key in adds:
@ -2229,9 +2243,12 @@ class PowerVCImageManager(service.Service):
# Adds are keys in the source that are not in the target # Adds are keys in the source that are not in the target
adds = src_image_set.difference(tgt_image_set) adds = src_image_set.difference(tgt_image_set)
# Deletes are keys in the target that are not in the source. # Deletes are keys in the target that are not in the source.
deletes = tgt_image_set.difference(src_image_set) # Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change. Skip deleting the keys
# that are not in the source.
# deletes = tgt_image_set.difference(src_image_set)
deletes = None
# Get the adds and updates # Get the adds and updates
add_update_dict = {} add_update_dict = {}
@ -3259,19 +3276,35 @@ class PowerVCImageManager(service.Service):
# update_at dict so the change isn't processed during a periodic # update_at dict so the change isn't processed during a periodic
# scan # scan
if pvc_id in self.pvc_updated_at.keys(): if pvc_id in self.pvc_updated_at.keys():
# Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change
if isinstance(pvc_image, dict):
self.pvc_updated_at[pvc_id] = pvc_image['updated_at']
else:
self.pvc_updated_at[pvc_id] = pvc_image.updated_at self.pvc_updated_at[pvc_id] = pvc_image.updated_at
# Attempt to update the entry for this image in the local # Attempt to update the entry for this image in the local
# updated_at dict so that it is not processed during a periodic # updated_at dict so that it is not processed during a periodic
# sync due to this update. # sync due to this update.
if pvc_id in self.local_updated_at.keys(): if pvc_id in self.local_updated_at.keys():
# Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change
if isinstance(image, dict):
self.local_updated_at[pvc_id] = image['updated_at']
else:
self.local_updated_at[pvc_id] = image.updated_at self.local_updated_at[pvc_id] = image.updated_at
# Set the new master image # Set the new master image
self.master_image[pvc_id] = pvc_image self.master_image[pvc_id] = pvc_image
# Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change
if isinstance(pvc_image, dict):
pvc_image_name = pvc_image['name']
else:
pvc_image_name = pvc_image.name
LOG.info(_('Completed update sync of image \'%s\' from PowerVC to ' LOG.info(_('Completed update sync of image \'%s\' from PowerVC to '
'the local hosting OS after an image update event'), 'the local hosting OS after an image update event'),
pvc_image.name) pvc_image_name)
except Exception as e: except Exception as e:
LOG.exception(_('An error occurred processing the PowerVC image ' LOG.exception(_('An error occurred processing the PowerVC image '
'update event: %s'), e) 'update event: %s'), e)
@ -3470,9 +3503,15 @@ class PowerVCImageManager(service.Service):
# Update the image if it is in the local hosting OS, else add it # Update the image if it is in the local hosting OS, else add it
if local_image is not None: if local_image is not None:
# Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change
if isinstance(pvc_image, dict):
pvc_image_name = pvc_image['name']
else:
pvc_image_name = pvc_image.name
LOG.info(_('The local hosting OS image \'%s\' with PowerVC ' LOG.info(_('The local hosting OS image \'%s\' with PowerVC '
'UUID %s already exists so it will be updated.'), 'UUID %s already exists so it will be updated.'),
pvc_image.name, pvc_id) pvc_image_name, pvc_id)
# If this is a snapshot image, it may not have an entry in the # If this is a snapshot image, it may not have an entry in the
# ids_dict so add one here. # ids_dict so add one here.
@ -3525,9 +3564,15 @@ class PowerVCImageManager(service.Service):
pvc_v2client.http_client.endpoint, v1local_images, pvc_v2client.http_client.endpoint, v1local_images,
v2local_images) v2local_images)
if image is None: if image is None:
# Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change
if isinstance(pvc_image, dict):
pvc_image_name = pvc_image['name']
else:
pvc_image_name = pvc_image.name
LOG.error(_('Local hosting OS image \'%s\' for PowerVC' LOG.error(_('Local hosting OS image \'%s\' for PowerVC'
'UUID %s could not be created after an ' 'UUID %s could not be created after an '
'image create event.'), pvc_image.name, 'image create event.'), pvc_image_name,
pvc_id) pvc_id)
return return
@ -3552,9 +3597,15 @@ class PowerVCImageManager(service.Service):
# only be used if the there is an image for the UUID on hoth # only be used if the there is an image for the UUID on hoth
# servers. # servers.
self.master_image[pvc_id] = pvc_image self.master_image[pvc_id] = pvc_image
# Fix for Bug#1814739. Handle missing custom properties for an
# image due to API version change
if isinstance(pvc_image, dict):
pvc_image_name = pvc_image['name']
else:
pvc_image_name = pvc_image.name
LOG.info(_('Completed add sync of image \'%s\' from PowerVC to the' LOG.info(_('Completed add sync of image \'%s\' from PowerVC to the'
' local hosting OS after an image activate event'), ' local hosting OS after an image activate event'),
pvc_image.name) pvc_image_name)
except Exception as e: except Exception as e:
LOG.exception(_('An error occurred processing the PowerVC image ' LOG.exception(_('An error occurred processing the PowerVC image '
'create event: %s'), e) 'create event: %s'), e)