Merge pull request #23 from jk0/master

Implement backup with rotation.
This commit is contained in:
Sandy Walsh 2011-06-24 12:08:07 -07:00
commit c1b1420b68
6 changed files with 31 additions and 9 deletions

@ -47,7 +47,7 @@ copyright = u'Rackspace, based on work by Jacob Kaplan-Moss'
# The short X.Y version.
version = '2.5'
# The full version, including alpha/beta/rc tags.
release = '2.5.5'
release = '2.5.6'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

@ -47,7 +47,7 @@ class ImageManager(base.ManagerWithFind):
return self._list("/images%s" % detail, "images")
def create(self, name, server):
def create(self, server, image_type=None, name=None, rotation=None):
"""
Create a new image by snapshotting a running :class:`Server`
@ -55,7 +55,20 @@ class ImageManager(base.ManagerWithFind):
:param server: The :class:`Server` (or its ID) to make a snapshot of.
:rtype: :class:`Image`
"""
data = {"image": {"serverId": base.getid(server), "name": name}}
if image_type is None:
image_type = "snapshot"
if image_type not in ("daily", "weekly", "snapshot"):
raise Exception("Invalid image_type: must be daily, "
"weekly or snapshot")
if image_type == "snapshot" and not name:
raise Exception("name is required for snapshots")
elif image_type != "snapshot" and not rotation:
raise Exception("rotation is required for backups")
data = {"image": {"serverId": base.getid(server), "name": name,
"image_type": image_type, "rotation": rotation}}
return self._create("/images", data, "image")
def delete(self, image):

@ -480,11 +480,20 @@ class OpenStackShell(object):
print_list(self.cs.images.list(), ['ID', 'Name', 'Status'])
@arg('server', metavar='<server>', help='Name or ID of server.')
@arg('name', metavar='<name>', help='Name for the new image.')
@arg('image_type', metavar='<image_type>', default='snapshot', help='daily, weekly or snapshot (default)')
@arg('--rotation',
default=None,
type=int,
metavar='<rotation>',
help="Number of backups to retain. (for image-type daily or weekly)")
@arg('--name',
default=None,
metavar='<name>',
help="Name of the new snapshot")
def do_image_create(self, args):
"""Create a new image by taking a snapshot of a running server."""
server = self._find_server(args.server)
image = self.cs.images.create(args.name, server)
image = self.cs.images.create(server, image_type=args.image_type, name=args.name, rotation=args.rotation)
print_dict(image._info)
@arg('image', metavar='<image>', help='Name or ID of image.')

@ -11,7 +11,7 @@ if sys.version_info < (2,6):
setup(
name = "python-novaclient",
version = "2.5.5",
version = "2.5.6",
description = "Client library for OpenStack Nova API",
long_description = read('README.rst'),
url = 'https://github.com/rackspace/python-novaclient',

@ -336,7 +336,7 @@ class FakeClient(OpenStackClient):
def post_images(self, body, **kw):
assert_equal(body.keys(), ['image'])
assert_has_keys(body['image'], required=['serverId', 'name'])
assert_has_keys(body['image'], required=['serverId', 'name', 'image_type', 'rotation'])
return (202, self.get_images_1()[1])
def delete_images_1(self, **kw):

@ -192,10 +192,10 @@ def test_image_list():
def test_image_create():
shell('image-create sample-server new-image')
shell('image-create sample-server snapshot --name new-image')
assert_called(
'POST', '/images',
{'image': {'name': 'new-image', 'serverId': 1234}}
{'image': {'name': 'new-image', 'serverId': 1234, 'image_type': 'snapshot', 'rotation': None}}
)