def show(self, req, volume_id, id): """Return a single metadata item.""" context = req.environ['cinder.context'] data = self._get_metadata(context, volume_id) try: return {'meta': {id: data[id]}} except KeyError: raise exception.VolumeMetadataNotFound(volume_id=volume_id, metadata_key=id)
def _get_metadata_value(self, obj, key): if key not in obj['metadata']: if isinstance(obj, volume.Volume): raise exception.VolumeMetadataNotFound(volume_id=obj['id'], metadata_key=key) elif isinstance(obj, snapshot.Snapshot): raise exception.SnapshotMetadataNotFound(snapshot_id=obj['id'], metadata_key=key) else: raise exception.MetadataAbsent() return obj['metadata'][key]
def delete(self, req, volume_id, id): """Deletes an existing metadata.""" context = req.environ['cinder.context'] volume, metadata = self._get_volume_and_metadata(context, volume_id) if id not in metadata: raise exception.VolumeMetadataNotFound(volume_id=volume_id, metadata_key=id) # Not found exception will be handled at the wsgi level self.volume_api.delete_volume_metadata( context, volume, id, meta_type=common.METADATA_TYPES.user) return webob.Response(status_int=200)
def delete_volume(self, volume): """Deletes a volume.""" LOG.debug("Delete volume with id %s", volume['id']) # 1. Check for provider location if not volume['provider_location']: LOG.warning('Volume %s does not have provider_location specified', volume['name']) raise exception.VolumeMetadataNotFound( volume_id=volume['id'], metadata_key='provider_location') # 2. Message data plane for volume deletion message_body = {'display_name': volume['name']} # if Secondary_datanode_key is present, # delete the replica from secondary datanode. rt_key = None # Get metadata for volume metadata = self._get_volume_metadata(volume) rt_key = self._get_volume_metadata_value(metadata, 'Secondary_datanode_key') rt_dn_ip = self._get_volume_metadata_value(metadata, 'Secondary_datanode_ip') current_dn_ip = self._get_volume_metadata_value(metadata, 'current_dn_ip') if current_dn_ip is not None and rt_dn_ip == current_dn_ip: rt_key = None # Send Delete Volume to Data Node try: if rt_key is not None: util.message_data_plane( rt_key, 'hyperscale.storage.dm.volume.delete', **message_body) util.message_data_plane( self.dn_routing_key, 'hyperscale.storage.dm.volume.delete', **message_body) except (exception.UnableToProcessHyperScaleCmdOutput, exception.ErrorInSendingMsg): LOG.error('Exception while deleting volume', exc_info=True) raise exception.VolumeIsBusy(volume_name=volume['name'])