635a1aa8a9
This patch adds an API to decouple blobs parent removing dependency on it. Blob stays thin after this operation. Also unit tests for blobstore inflate are improved and reused with decouple parent functionality. Change-Id: I96dfee467c78cf4f4d929ec7bc05263f7a23a8aa Signed-off-by: Tomasz Kulasek <tomaszx.kulasek@intel.com> Reviewed-on: https://review.gerrithub.io/410829 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
187 lines
5.4 KiB
Python
Executable File
187 lines
5.4 KiB
Python
Executable File
def construct_lvol_store(client, bdev_name, lvs_name, cluster_sz=None):
|
|
"""Construct a logical volume store.
|
|
|
|
Args:
|
|
bdev_name: bdev on which to construct logical volume store
|
|
lvs_name: name of the logical volume store to create
|
|
cluster_sz: cluster size of the logical volume store in bytes (optional)
|
|
|
|
Returns:
|
|
UUID of created logical volume store.
|
|
"""
|
|
params = {'bdev_name': bdev_name, 'lvs_name': lvs_name}
|
|
if cluster_sz:
|
|
params['cluster_sz'] = cluster_sz
|
|
return client.call('construct_lvol_store', params)
|
|
|
|
|
|
def rename_lvol_store(client, old_name, new_name):
|
|
"""Rename a logical volume store.
|
|
|
|
Args:
|
|
old_name: existing logical volume store name
|
|
new_name: new logical volume store name
|
|
"""
|
|
params = {
|
|
'old_name': old_name,
|
|
'new_name': new_name
|
|
}
|
|
return client.call('rename_lvol_store', params)
|
|
|
|
|
|
def construct_lvol_bdev(client, lvol_name, size, thin_provision=False, uuid=None, lvs_name=None):
|
|
"""Create a logical volume on a logical volume store.
|
|
|
|
Args:
|
|
lvol_name: name of logical volume to create
|
|
size: desired size of logical volume in bytes (will be rounded up to a multiple of cluster size)
|
|
thin_provision: True to enable thin provisioning
|
|
uuid: UUID of logical volume store to create logical volume on (optional)
|
|
lvs_name: name of logical volume store to create logical volume on (optional)
|
|
|
|
Either uuid or lvs_name must be specified, but not both.
|
|
"""
|
|
if (uuid and lvs_name) or (not uuid and not lvs_name):
|
|
raise ValueError("Either uuid or lvs_name must be specified, but not both")
|
|
|
|
params = {'lvol_name': lvol_name, 'size': size}
|
|
if thin_provision:
|
|
params['thin_provision'] = thin_provision
|
|
if uuid:
|
|
params['uuid'] = uuid
|
|
if lvs_name:
|
|
params['lvs_name'] = lvs_name
|
|
return client.call('construct_lvol_bdev', params)
|
|
|
|
|
|
def snapshot_lvol_bdev(client, lvol_name, snapshot_name):
|
|
"""Capture a snapshot of the current state of a logical volume.
|
|
|
|
Args:
|
|
lvol_name: logical volume to create a snapshot from
|
|
snapshot_name: name for the newly created snapshot
|
|
"""
|
|
params = {
|
|
'lvol_name': lvol_name,
|
|
'snapshot_name': snapshot_name
|
|
}
|
|
return client.call('snapshot_lvol_bdev', params)
|
|
|
|
|
|
def clone_lvol_bdev(client, snapshot_name, clone_name):
|
|
"""Create a logical volume based on a snapshot.
|
|
|
|
Args:
|
|
snapshot_name: snapshot to clone
|
|
clone_name: name of logical volume to create
|
|
"""
|
|
params = {
|
|
'snapshot_name': snapshot_name,
|
|
'clone_name': clone_name
|
|
}
|
|
return client.call('clone_lvol_bdev', params)
|
|
|
|
|
|
def rename_lvol_bdev(client, old_name, new_name):
|
|
"""Rename a logical volume.
|
|
|
|
Args:
|
|
old_name: existing logical volume name
|
|
new_name: new logical volume name
|
|
"""
|
|
params = {
|
|
'old_name': old_name,
|
|
'new_name': new_name
|
|
}
|
|
return client.call('rename_lvol_bdev', params)
|
|
|
|
|
|
def resize_lvol_bdev(client, name, size):
|
|
"""Resize a logical volume.
|
|
|
|
Args:
|
|
name: name of logical volume to resize
|
|
size: desired size of logical volume in bytes (will be rounded up to a multiple of cluster size)
|
|
"""
|
|
params = {
|
|
'name': name,
|
|
'size': size,
|
|
}
|
|
return client.call('resize_lvol_bdev', params)
|
|
|
|
|
|
def destroy_lvol_bdev(client, name):
|
|
"""Destroy a logical volume.
|
|
|
|
Args:
|
|
name: name of logical volume to destroy
|
|
"""
|
|
params = {
|
|
'name': name,
|
|
}
|
|
return client.call('destroy_lvol_bdev', params)
|
|
|
|
|
|
def inflate_lvol_bdev(client, name):
|
|
"""Inflate a logical volume.
|
|
|
|
Args:
|
|
name: name of logical volume to inflate
|
|
"""
|
|
params = {
|
|
'name': name,
|
|
}
|
|
return client.call('inflate_lvol_bdev', params)
|
|
|
|
|
|
def decouple_parent_lvol_bdev(client, name):
|
|
"""Decouple parent of a logical volume.
|
|
|
|
Args:
|
|
name: name of logical volume to decouple parent
|
|
"""
|
|
params = {
|
|
'name': name,
|
|
}
|
|
return client.call('decouple_parent_lvol_bdev', params)
|
|
|
|
|
|
def destroy_lvol_store(client, uuid=None, lvs_name=None):
|
|
"""Destroy a logical volume store.
|
|
|
|
Args:
|
|
uuid: UUID of logical volume store to destroy (optional)
|
|
lvs_name: name of logical volume store to destroy (optional)
|
|
|
|
Either uuid or lvs_name must be specified, but not both.
|
|
"""
|
|
if (uuid and lvs_name) or (not uuid and not lvs_name):
|
|
raise ValueError("Exactly one of uuid or lvs_name must be specified")
|
|
|
|
params = {}
|
|
if uuid:
|
|
params['uuid'] = uuid
|
|
if lvs_name:
|
|
params['lvs_name'] = lvs_name
|
|
return client.call('destroy_lvol_store', params)
|
|
|
|
|
|
def get_lvol_stores(client, uuid=None, lvs_name=None):
|
|
"""List logical volume stores.
|
|
|
|
Args:
|
|
uuid: UUID of logical volume store to retrieve information about (optional)
|
|
lvs_name: name of logical volume store to retrieve information about (optional)
|
|
|
|
Either uuid or lvs_name may be specified, but not both.
|
|
If both uuid and lvs_name are omitted, information about all logical volume stores is returned.
|
|
"""
|
|
if (uuid and lvs_name):
|
|
raise ValueError("Exactly one of uuid or lvs_name may be specified")
|
|
params = {}
|
|
if uuid:
|
|
params['uuid'] = uuid
|
|
if lvs_name:
|
|
params['lvs_name'] = lvs_name
|
|
return client.call('get_lvol_stores', params)
|