Skip to content
This repository was archived by the owner on Nov 29, 2023. It is now read-only.

Commit cee51f8

Browse files
committed
Refactored backup rotation.
1 parent 8a52343 commit cee51f8

6 files changed

Lines changed: 40 additions & 22 deletions

File tree

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
# The short X.Y version.
4848
version = '2.5'
4949
# The full version, including alpha/beta/rc tags.
50-
release = '2.5.6'
50+
release = '2.5.7'
5151

5252
# The language for content autogenerated by Sphinx. Refer to documentation
5353
# for a list of supported languages.

novaclient/images.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def list(self, detailed=True):
4747
return self._list("/images%s" % detail, "images")
4848

4949

50-
def create(self, server, image_type=None, name=None, rotation=None):
50+
def create(self, server, name, image_type=None, backup_type=None, rotation=None):
5151
"""
5252
Create a new image by snapshotting a running :class:`Server`
5353
@@ -58,17 +58,20 @@ def create(self, server, image_type=None, name=None, rotation=None):
5858
if image_type is None:
5959
image_type = "snapshot"
6060

61-
if image_type not in ("daily", "weekly", "snapshot"):
62-
raise Exception("Invalid image_type: must be daily, "
63-
"weekly or snapshot")
61+
if image_type not in ("backup", "snapshot"):
62+
raise Exception("Invalid image_type: must be backup or snapshot")
6463

65-
if image_type == "snapshot" and not name:
66-
raise Exception("name is required for snapshots")
67-
elif image_type != "snapshot" and not rotation:
68-
raise Exception("rotation is required for backups")
64+
if image_type == "backup":
65+
if not rotation:
66+
raise Exception("rotation is required for backups")
67+
elif not backup_type:
68+
raise Exception("backup_type required for backups")
69+
elif backup_type not in ("daily", "weekly"):
70+
raise Exception("Invalid backup_type: must be daily or weekly")
6971

7072
data = {"image": {"serverId": base.getid(server), "name": name,
71-
"image_type": image_type, "rotation": rotation}}
73+
"image_type": image_type, "backup_type": backup_type,
74+
"rotation": rotation}}
7275
return self._create("/images", data, "image")
7376

7477
def delete(self, image):

novaclient/shell.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -474,20 +474,27 @@ def do_image_list(self, args):
474474
print_list(self.cs.images.list(), ['ID', 'Name', 'Status'])
475475

476476
@arg('server', metavar='<server>', help='Name or ID of server.')
477-
@arg('image_type', metavar='<image_type>', default='snapshot', help='daily, weekly or snapshot (default)')
477+
@arg('name', metavar='<name>', help='Name of backup or snapshot.')
478+
@arg('--image-type',
479+
metavar='<backup|snapshot>',
480+
default='snapshot',
481+
help='type of image (default: snapshot)')
482+
@arg('--backup-type',
483+
metavar='<daily|weekly>',
484+
default=None,
485+
help='type of backup')
478486
@arg('--rotation',
479487
default=None,
480488
type=int,
481489
metavar='<rotation>',
482-
help="Number of backups to retain. (for image-type daily or weekly)")
483-
@arg('--name',
484-
default=None,
485-
metavar='<name>',
486-
help="Name of the new snapshot")
490+
help="Number of backups to retain. Used for backup image_type.")
487491
def do_image_create(self, args):
488492
"""Create a new image by taking a snapshot of a running server."""
489493
server = self._find_server(args.server)
490-
image = self.cs.images.create(server, image_type=args.image_type, name=args.name, rotation=args.rotation)
494+
image = self.cs.images.create(server, args.name,
495+
image_type=args.image_type,
496+
backup_type=args.backup_type,
497+
rotation=args.rotation)
491498
print_dict(image._info)
492499

493500
@arg('image', metavar='<image>', help='Name or ID of image.')

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def read(fname):
1111

1212
setup(
1313
name = "python-novaclient",
14-
version = "2.5.6",
14+
version = "2.5.7",
1515
description = "Client library for OpenStack Nova API",
1616
long_description = read('README.rst'),
1717
url = 'https://github.com/rackspace/python-novaclient',

tests/fakeserver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ def get_images_2(self, **kw):
336336

337337
def post_images(self, body, **kw):
338338
assert_equal(body.keys(), ['image'])
339-
assert_has_keys(body['image'], required=['serverId', 'name', 'image_type', 'rotation'])
339+
assert_has_keys(body['image'], required=['serverId', 'name', 'image_type', 'backup_type', 'rotation'])
340340
return (202, self.get_images_1()[1])
341341

342342
def delete_images_1(self, **kw):

tests/test_shell.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,19 @@ def test_image_list():
191191
assert_called('GET', '/images/detail')
192192

193193

194-
def test_image_create():
195-
shell('image-create sample-server snapshot --name new-image')
194+
def test_snapshot_create():
195+
shell('image-create sample-server mysnapshot')
196196
assert_called(
197197
'POST', '/images',
198-
{'image': {'name': 'new-image', 'serverId': 1234, 'image_type': 'snapshot', 'rotation': None}}
198+
{'image': {'name': 'mysnapshot', 'serverId': 1234, 'image_type': 'snapshot', 'backup_type': None, 'rotation': None}}
199+
)
200+
201+
202+
def test_backup_create():
203+
shell('image-create sample-server mybackup --image-type backup --backup-type daily --rotation 1')
204+
assert_called(
205+
'POST', '/images',
206+
{'image': {'name': 'mybackup', 'serverId': 1234, 'image_type': 'backup', 'backup_type': 'daily', 'rotation': 1}}
199207
)
200208

201209

0 commit comments

Comments
 (0)