From 04ef22667633672d0f14eec49fe6ac3ef26200c6 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Fri, 24 Jun 2011 12:24:26 -0500 Subject: [PATCH] Implemented backup with rotation. --- docs/conf.py | 2 +- novaclient/images.py | 14 ++++++++++++-- novaclient/shell.py | 12 ++++++++++-- setup.py | 2 +- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index d8bbb5f07..999dd3c24 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -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. diff --git a/novaclient/images.py b/novaclient/images.py index 3d19bff9f..236da6d13 100644 --- a/novaclient/images.py +++ b/novaclient/images.py @@ -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="snapshot", name=None, rotation=None): """ Create a new image by snapshotting a running :class:`Server` @@ -55,7 +55,17 @@ 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 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): diff --git a/novaclient/shell.py b/novaclient/shell.py index 33a45b721..f34c3477d 100644 --- a/novaclient/shell.py +++ b/novaclient/shell.py @@ -474,11 +474,19 @@ class OpenStackShell(object): print_list(self.cs.images.list(), ['ID', 'Name', 'Status']) @arg('server', metavar='', help='Name or ID of server.') - @arg('name', metavar='', help='Name for the new image.') + @arg('image_type', metavar='', default='snapshot', help='daily, weekly or snapshot (default)') + @arg('--rotation', + default=None, + metavar='', + help="Number of backups to retain. (for image-type daily or weekly)") + @arg('--name', + default=None, + metavar='', + 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='', help='Name or ID of image.') diff --git a/setup.py b/setup.py index 353900e6f..a51e28c18 100644 --- a/setup.py +++ b/setup.py @@ -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',