parent
e419855911
commit
1de57ab6f3
|
@ -855,6 +855,29 @@ def ceph_volume_add(config, pool, volume, size):
|
||||||
|
|
||||||
return retstatus, response.json()['message']
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_volume_upload(config, pool, volume, image_format, image_file):
|
||||||
|
"""
|
||||||
|
Upload a disk image to a Ceph volume
|
||||||
|
|
||||||
|
API endpoint: POST /api/v1/storage/ceph/volume/{pool}/{volume}/upload
|
||||||
|
API arguments: image_format={image_format}
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
params = {
|
||||||
|
'image_format': image_format
|
||||||
|
}
|
||||||
|
files = {
|
||||||
|
'file': open(image_file,'rb')
|
||||||
|
}
|
||||||
|
response = call_api(config, 'post', '/storage/ceph/volume/{}/{}/upload'.format(pool, volume), params=params, files=files)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
def ceph_volume_remove(config, pool, volume):
|
def ceph_volume_remove(config, pool, volume):
|
||||||
"""
|
"""
|
||||||
Remove Ceph volume
|
Remove Ceph volume
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
import requests
|
import requests
|
||||||
import click
|
import click
|
||||||
|
|
||||||
def call_api(config, operation, request_uri, params=None, data=None):
|
def call_api(config, operation, request_uri, params=None, data=None, files=None):
|
||||||
# Craft the URI
|
# Craft the URI
|
||||||
uri = '{}://{}{}{}'.format(
|
uri = '{}://{}{}{}'.format(
|
||||||
config['api_scheme'],
|
config['api_scheme'],
|
||||||
|
@ -52,14 +52,16 @@ def call_api(config, operation, request_uri, params=None, data=None):
|
||||||
uri,
|
uri,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
params=params,
|
params=params,
|
||||||
data=data
|
data=data,
|
||||||
|
files=files
|
||||||
)
|
)
|
||||||
if operation == 'put':
|
if operation == 'put':
|
||||||
response = requests.put(
|
response = requests.put(
|
||||||
uri,
|
uri,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
params=params,
|
params=params,
|
||||||
data=data
|
data=data,
|
||||||
|
files=files
|
||||||
)
|
)
|
||||||
if operation == 'patch':
|
if operation == 'patch':
|
||||||
response = requests.patch(
|
response = requests.patch(
|
||||||
|
|
|
@ -1726,6 +1726,40 @@ def ceph_volume_add(pool, name, size):
|
||||||
retcode, retmsg = pvc_ceph.ceph_volume_add(config, pool, name, size)
|
retcode, retmsg = pvc_ceph.ceph_volume_add(config, pool, name, size)
|
||||||
cleanup(retcode, retmsg)
|
cleanup(retcode, retmsg)
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# pvc storage volume upload
|
||||||
|
###############################################################################
|
||||||
|
@click.command(name='upload', short_help='Upload a local image file to RBD volume.')
|
||||||
|
@click.argument(
|
||||||
|
'pool'
|
||||||
|
)
|
||||||
|
@click.argument(
|
||||||
|
'name'
|
||||||
|
)
|
||||||
|
@click.argument(
|
||||||
|
'image_file'
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
'-f', '--format', 'image_format',
|
||||||
|
default='raw', show_default=True,
|
||||||
|
help='The format of the source image.'
|
||||||
|
)
|
||||||
|
def ceph_volume_upload(pool, name, image_format, image_file):
|
||||||
|
"""
|
||||||
|
Upload a disk image file IMAGE_FILE to the RBD volume NAME in pool POOL.
|
||||||
|
|
||||||
|
The volume NAME must exist in the pool before uploading to it, and must be large enough to fit the disk image in raw format.
|
||||||
|
|
||||||
|
If the image format is "raw", the image is uploaded directly to the target volume without modification. Otherwise, it will be converted into raw format by "qemu-img convert" on the remote side before writing using a temporary volume. The image format must be a valid format recognized by "qemu-img", such as "vmdk" or "qcow2".
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not os.path.exists(image_file):
|
||||||
|
click.echo("ERROR: File '{}' does not exist!".format(image_file))
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
retcode, retmsg = pvc_ceph.ceph_volume_upload(config, pool, name, image_format, image_file)
|
||||||
|
cleanup(retcode, retmsg)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage volume remove
|
# pvc storage volume remove
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -3271,6 +3305,7 @@ ceph_pool.add_command(ceph_pool_remove)
|
||||||
ceph_pool.add_command(ceph_pool_list)
|
ceph_pool.add_command(ceph_pool_list)
|
||||||
|
|
||||||
ceph_volume.add_command(ceph_volume_add)
|
ceph_volume.add_command(ceph_volume_add)
|
||||||
|
ceph_volume.add_command(ceph_volume_upload)
|
||||||
ceph_volume.add_command(ceph_volume_resize)
|
ceph_volume.add_command(ceph_volume_resize)
|
||||||
ceph_volume.add_command(ceph_volume_rename)
|
ceph_volume.add_command(ceph_volume_rename)
|
||||||
ceph_volume.add_command(ceph_volume_clone)
|
ceph_volume.add_command(ceph_volume_clone)
|
||||||
|
|
Loading…
Reference in New Issue