def delete(volume_id):
"""Deletes the volume pointed by the id.
Args:
volume_id (str): The id parsed from the URL
Returns:
tuple: payload, http status code, headers
"""
manager = app.volume_manager
target_volume = manager.by_id(volume_id)
if target_volume is None:
return {'message': 'Not Found'}, 404
if target_volume.value['state'] != 'ready':
return {'message': 'Resource not in ready state, can\'t delete.'}, 409
lock = manager.get_lock(volume_id, 'clone')
lock.acquire(timeout=0, lock_ttl=10)
pending_clones = []
for volume in manager.all()[1]:
if volume.value['control']['parent_id'] == volume_id:
pending_clones.append(manager.get_id_from_key(volume.key))
if pending_clones:
lock.release()
return {'message': 'Resource has pending clones, can\'t delete.',
'clones': pending_clones}, 409
target_volume.value['state'] = 'deleting'
target_volume = manager.update(target_volume)
lock.release()
if not target_volume:
return {'message': 'Resource changed during transition.'}, 409
result, _ = VolumeSchema().dump(target_volume)
return result, 202, {'Location': app.api.url_for(Volume, volume_id=result['id'])}
评论列表
文章目录