@ -3334,6 +3334,53 @@ class API_Storage_Ceph_Volume_Element_Clone(Resource):
|
||||
)
|
||||
api.add_resource(API_Storage_Ceph_Volume_Element_Clone, '/storage/ceph/volume/<pool>/<volume>/clone')
|
||||
|
||||
# /storage/ceph/volume/<pool>/<volume>/upload
|
||||
class API_Storage_Ceph_Volume_Element_Upload(Resource):
|
||||
@Authenticator
|
||||
def post(self, pool, volume):
|
||||
"""
|
||||
Upload a disk image to Ceph volume {volume} in pool {pool}
|
||||
---
|
||||
tags:
|
||||
- storage / ceph
|
||||
parameters:
|
||||
- in: query
|
||||
name: file
|
||||
type: binary
|
||||
required: true
|
||||
description: The raw binary contents of the file
|
||||
responses:
|
||||
200:
|
||||
description: OK
|
||||
schema:
|
||||
type: object
|
||||
id: Message
|
||||
404:
|
||||
description: Not found
|
||||
schema:
|
||||
type: object
|
||||
id: Message
|
||||
400:
|
||||
description: Bad request
|
||||
schema:
|
||||
type: object
|
||||
id: Message
|
||||
"""
|
||||
from flask_restful import reqparse
|
||||
from werkzeug.datastructures import FileStorage
|
||||
parser = reqparse.RequestParser()
|
||||
parser.add_argument('file', type=FileStorage, location='files')
|
||||
data = parser.parse_args()
|
||||
image_data = data.get('file', None)
|
||||
if not image_data:
|
||||
return {'message':'An image file contents must be specified'}, 400
|
||||
return api_helper.ceph_volume_upload(
|
||||
pool,
|
||||
volume,
|
||||
image_data
|
||||
)
|
||||
api.add_resource(API_Storage_Ceph_Volume_Element_Upload, '/storage/ceph/volume/<pool>/<volume>/upload')
|
||||
|
||||
# /storage/ceph/snapshot
|
||||
class API_Storage_Ceph_Snapshot_Root(Resource):
|
||||
@RequestParser([
|
||||
|
@ -1327,6 +1327,49 @@ def ceph_volume_remove(pool, name):
|
||||
}
|
||||
return output, retcode
|
||||
|
||||
def ceph_volume_upload(pool, volume, data):
|
||||
"""
|
||||
Upload a raw file via HTTP post to a PVC Ceph volume
|
||||
"""
|
||||
# Map the target blockdev
|
||||
zk_conn = pvc_common.startZKConnection(config['coordinators'])
|
||||
retflag, retdata = pvc_ceph.map_volume(zk_conn, pool, volume)
|
||||
pvc_common.stopZKConnection(zk_conn)
|
||||
if not retflag:
|
||||
output = {
|
||||
'message': retdata.replace('\"', '\'')
|
||||
}
|
||||
retcode = 400
|
||||
return output, retcode
|
||||
blockdev = retdata
|
||||
|
||||
output = {
|
||||
'message': "Wrote uploaded file to volume '{}' in pool '{}'.".format(volume, pool)
|
||||
}
|
||||
retcode = 200
|
||||
|
||||
# Save the data to the blockdev
|
||||
try:
|
||||
data.save(blockdev)
|
||||
except:
|
||||
output = {
|
||||
'message': "ERROR: Failed to write image file to volume."
|
||||
}
|
||||
retcode = 400
|
||||
|
||||
# Unmap the target blockdev
|
||||
zk_conn = pvc_common.startZKConnection(config['coordinators'])
|
||||
retflag, retdata = pvc_ceph.unmap_volume(zk_conn, pool, volume)
|
||||
pvc_common.stopZKConnection(zk_conn)
|
||||
if not retflag:
|
||||
output = {
|
||||
'message': retdata.replace('\"', '\'')
|
||||
}
|
||||
retcode = 400
|
||||
return output, retcode
|
||||
|
||||
return output, retcode
|
||||
|
||||
def ceph_volume_snapshot_list(pool=None, volume=None, limit=None, is_fuzzy=True):
|
||||
"""
|
||||
Get the list of RBD volume snapshots in the Ceph storage cluster.
|
||||
|
Reference in New Issue
Block a user