summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Kearney <josh@jk0.org>2011-06-24 14:48:14 -0500
committerJosh Kearney <josh@jk0.org>2011-06-24 14:48:14 -0500
commitcee51f8aff494c1e7dd266e2a24c9dc9bb7b18f8 (patch)
tree8b1c62d851baff84679772f0a211737c86fcd489
parent8a523431e3db9a1390933036532dc9f2ffacf17f (diff)
downloadpython-novaclient-cee51f8aff494c1e7dd266e2a24c9dc9bb7b18f8.tar.gz
Refactored backup rotation.
-rw-r--r--docs/conf.py2
-rw-r--r--novaclient/images.py21
-rw-r--r--novaclient/shell.py21
-rw-r--r--setup.py2
-rw-r--r--tests/fakeserver.py2
-rw-r--r--tests/test_shell.py14
6 files changed, 40 insertions, 22 deletions
diff --git a/docs/conf.py b/docs/conf.py
index 999dd3c2..dc034780 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.6'
+release = '2.5.7'
# 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 d7d07e33..d911cc74 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, server, image_type=None, name=None, rotation=None):
+ def create(self, server, name, image_type=None, backup_type=None, rotation=None):
"""
Create a new image by snapshotting a running :class:`Server`
@@ -58,17 +58,20 @@ class ImageManager(base.ManagerWithFind):
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 not in ("backup", "snapshot"):
+ raise Exception("Invalid image_type: must be backup 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")
+ if image_type == "backup":
+ if not rotation:
+ raise Exception("rotation is required for backups")
+ elif not backup_type:
+ raise Exception("backup_type required for backups")
+ elif backup_type not in ("daily", "weekly"):
+ raise Exception("Invalid backup_type: must be daily or weekly")
data = {"image": {"serverId": base.getid(server), "name": name,
- "image_type": image_type, "rotation": rotation}}
+ "image_type": image_type, "backup_type": backup_type,
+ "rotation": rotation}}
return self._create("/images", data, "image")
def delete(self, image):
diff --git a/novaclient/shell.py b/novaclient/shell.py
index e439d2c0..03fa2e1f 100644
--- a/novaclient/shell.py
+++ b/novaclient/shell.py
@@ -474,20 +474,27 @@ class OpenStackShell(object):
print_list(self.cs.images.list(), ['ID', 'Name', 'Status'])
@arg('server', metavar='<server>', help='Name or ID of server.')
- @arg('image_type', metavar='<image_type>', default='snapshot', help='daily, weekly or snapshot (default)')
+ @arg('name', metavar='<name>', help='Name of backup or snapshot.')
+ @arg('--image-type',
+ metavar='<backup|snapshot>',
+ default='snapshot',
+ help='type of image (default: snapshot)')
+ @arg('--backup-type',
+ metavar='<daily|weekly>',
+ default=None,
+ help='type of backup')
@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")
+ help="Number of backups to retain. Used for backup image_type.")
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(server, image_type=args.image_type, name=args.name, rotation=args.rotation)
+ image = self.cs.images.create(server, args.name,
+ image_type=args.image_type,
+ backup_type=args.backup_type,
+ rotation=args.rotation)
print_dict(image._info)
@arg('image', metavar='<image>', help='Name or ID of image.')
diff --git a/setup.py b/setup.py
index a51e28c1..633f364d 100644
--- a/setup.py
+++ b/setup.py
@@ -11,7 +11,7 @@ if sys.version_info < (2,6):
setup(
name = "python-novaclient",
- version = "2.5.6",
+ version = "2.5.7",
description = "Client library for OpenStack Nova API",
long_description = read('README.rst'),
url = 'https://github.com/rackspace/python-novaclient',
diff --git a/tests/fakeserver.py b/tests/fakeserver.py
index f9dc7ba7..bc5e9267 100644
--- a/tests/fakeserver.py
+++ b/tests/fakeserver.py
@@ -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', 'image_type', 'rotation'])
+ assert_has_keys(body['image'], required=['serverId', 'name', 'image_type', 'backup_type', 'rotation'])
return (202, self.get_images_1()[1])
def delete_images_1(self, **kw):
diff --git a/tests/test_shell.py b/tests/test_shell.py
index 3999936d..17ba5a44 100644
--- a/tests/test_shell.py
+++ b/tests/test_shell.py
@@ -191,11 +191,19 @@ def test_image_list():
assert_called('GET', '/images/detail')
-def test_image_create():
- shell('image-create sample-server snapshot --name new-image')
+def test_snapshot_create():
+ shell('image-create sample-server mysnapshot')
assert_called(
'POST', '/images',
- {'image': {'name': 'new-image', 'serverId': 1234, 'image_type': 'snapshot', 'rotation': None}}
+ {'image': {'name': 'mysnapshot', 'serverId': 1234, 'image_type': 'snapshot', 'backup_type': None, 'rotation': None}}
+ )
+
+
+def test_backup_create():
+ shell('image-create sample-server mybackup --image-type backup --backup-type daily --rotation 1')
+ assert_called(
+ 'POST', '/images',
+ {'image': {'name': 'mybackup', 'serverId': 1234, 'image_type': 'backup', 'backup_type': 'daily', 'rotation': 1}}
)