Add upload-to-image function to client.
Support uploading a volume to an image in the image service. Change-Id: Ief996f92aaf6d7a4fee0bce5ca45b92bee3f6990 Fixes: bug #1099866
This commit is contained in:
parent
61e2a4237f
commit
9a064c3d5c
@ -356,7 +356,7 @@ def do_snapshot_show(cs, args):
|
|||||||
@utils.arg('--force',
|
@utils.arg('--force',
|
||||||
metavar='<True|False>',
|
metavar='<True|False>',
|
||||||
help='Optional flag to indicate whether '
|
help='Optional flag to indicate whether '
|
||||||
'to snapshot a volume even if its '
|
'to snapshot a volume even if it\'s '
|
||||||
'attached to an instance. (Default=False)',
|
'attached to an instance. (Default=False)',
|
||||||
default=False)
|
default=False)
|
||||||
@utils.arg(
|
@utils.arg(
|
||||||
@ -600,3 +600,35 @@ def _print_type_extra_specs(vol_type):
|
|||||||
def _find_volume_type(cs, vtype):
|
def _find_volume_type(cs, vtype):
|
||||||
"""Get a volume type by name or ID."""
|
"""Get a volume type by name or ID."""
|
||||||
return utils.find_resource(cs.volume_types, vtype)
|
return utils.find_resource(cs.volume_types, vtype)
|
||||||
|
|
||||||
|
|
||||||
|
@utils.arg('volume_id',
|
||||||
|
metavar='<volume-id>',
|
||||||
|
help='ID of the volume to snapshot')
|
||||||
|
@utils.arg('--force',
|
||||||
|
metavar='<True|False>',
|
||||||
|
help='Optional flag to indicate whether '
|
||||||
|
'to upload a volume even if it\'s '
|
||||||
|
'attached to an instance. (Default=False)',
|
||||||
|
default=False)
|
||||||
|
@utils.arg('--container-format',
|
||||||
|
metavar='<container-format>',
|
||||||
|
help='Optional type for container format '
|
||||||
|
'(Default=bare)',
|
||||||
|
default='bare')
|
||||||
|
@utils.arg('--disk-format',
|
||||||
|
metavar='<disk-format>',
|
||||||
|
help='Optional type for disk format '
|
||||||
|
'(Default=raw)',
|
||||||
|
default='raw')
|
||||||
|
@utils.arg('image_name',
|
||||||
|
metavar='<image-name>',
|
||||||
|
help='Name for created image')
|
||||||
|
@utils.service_type('volume')
|
||||||
|
def do_upload_to_image(cs, args):
|
||||||
|
"""Upload volume to image service as image."""
|
||||||
|
volume = _find_volume(cs, args.volume_id)
|
||||||
|
volume.upload_to_image(args.force,
|
||||||
|
args.image_name,
|
||||||
|
args.container_format,
|
||||||
|
args.disk_format)
|
||||||
|
@ -104,6 +104,14 @@ class Volume(base.Resource):
|
|||||||
"""
|
"""
|
||||||
return self.manager.set_metadata(self, metadata)
|
return self.manager.set_metadata(self, metadata)
|
||||||
|
|
||||||
|
def upload_to_image(self, force, image_name, container_format,
|
||||||
|
disk_format):
|
||||||
|
"""
|
||||||
|
Upload a volume to image service as an image.
|
||||||
|
"""
|
||||||
|
self.manager.upload_to_image(self, force, image_name, container_format,
|
||||||
|
disk_format)
|
||||||
|
|
||||||
|
|
||||||
class VolumeManager(base.ManagerWithFind):
|
class VolumeManager(base.ManagerWithFind):
|
||||||
"""
|
"""
|
||||||
@ -316,3 +324,17 @@ class VolumeManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
for k in keys:
|
for k in keys:
|
||||||
self._delete("/volumes/%s/metadata/%s" % (base.getid(volume), k))
|
self._delete("/volumes/%s/metadata/%s" % (base.getid(volume), k))
|
||||||
|
|
||||||
|
def upload_to_image(self, volume, force, image_name, container_format,
|
||||||
|
disk_format):
|
||||||
|
"""
|
||||||
|
Upload volume to image service as image.
|
||||||
|
|
||||||
|
:param volume: The :class:`Volume` to upload.
|
||||||
|
"""
|
||||||
|
return self._action('os-volume_upload_image',
|
||||||
|
volume,
|
||||||
|
{'force': force,
|
||||||
|
'image_name': image_name,
|
||||||
|
'container_format': container_format,
|
||||||
|
'disk_format': disk_format})
|
||||||
|
@ -55,7 +55,7 @@ class ShellTest(utils.TestCase):
|
|||||||
help_text = self.shell('help')
|
help_text = self.shell('help')
|
||||||
for r in required:
|
for r in required:
|
||||||
self.assertThat(help_text,
|
self.assertThat(help_text,
|
||||||
matchers.MatchesRegex(r, re.DOTALL|re.MULTILINE))
|
matchers.MatchesRegex(r, re.DOTALL | re.MULTILINE))
|
||||||
|
|
||||||
def test_help_on_subcommand(self):
|
def test_help_on_subcommand(self):
|
||||||
required = [
|
required = [
|
||||||
@ -65,4 +65,4 @@ class ShellTest(utils.TestCase):
|
|||||||
help_text = self.shell('help list')
|
help_text = self.shell('help list')
|
||||||
for r in required:
|
for r in required:
|
||||||
self.assertThat(help_text,
|
self.assertThat(help_text,
|
||||||
matchers.MatchesRegex(r, re.DOTALL|re.MULTILINE))
|
matchers.MatchesRegex(r, re.DOTALL | re.MULTILINE))
|
||||||
|
Loading…
Reference in New Issue
Block a user