Esempio n. 1
0
    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)
Esempio n. 2
0
    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]
Esempio n. 3
0
    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)
Esempio n. 4
0
    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'])