Merge pull request #25 from jk0/master
Refactored backup rotation code.
This commit is contained in:
commit
ede425d3ab
@ -47,7 +47,7 @@ copyright = u'Rackspace, based on work by Jacob Kaplan-Moss'
|
|||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = '2.5'
|
version = '2.5'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# 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
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
|
@ -47,7 +47,7 @@ class ImageManager(base.ManagerWithFind):
|
|||||||
return self._list("/images%s" % detail, "images")
|
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`
|
Create a new image by snapshotting a running :class:`Server`
|
||||||
|
|
||||||
@ -58,17 +58,20 @@ class ImageManager(base.ManagerWithFind):
|
|||||||
if image_type is None:
|
if image_type is None:
|
||||||
image_type = "snapshot"
|
image_type = "snapshot"
|
||||||
|
|
||||||
if image_type not in ("daily", "weekly", "snapshot"):
|
if image_type not in ("backup", "snapshot"):
|
||||||
raise Exception("Invalid image_type: must be daily, "
|
raise Exception("Invalid image_type: must be backup or snapshot")
|
||||||
"weekly or snapshot")
|
|
||||||
|
|
||||||
if image_type == "snapshot" and not name:
|
if image_type == "backup":
|
||||||
raise Exception("name is required for snapshots")
|
if not rotation:
|
||||||
elif image_type != "snapshot" and not rotation:
|
raise Exception("rotation is required for backups")
|
||||||
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,
|
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")
|
return self._create("/images", data, "image")
|
||||||
|
|
||||||
def delete(self, image):
|
def delete(self, image):
|
||||||
|
@ -480,20 +480,27 @@ class OpenStackShell(object):
|
|||||||
print_list(self.cs.images.list(), ['ID', 'Name', 'Status'])
|
print_list(self.cs.images.list(), ['ID', 'Name', 'Status'])
|
||||||
|
|
||||||
@arg('server', metavar='<server>', help='Name or ID of server.')
|
@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',
|
@arg('--rotation',
|
||||||
default=None,
|
default=None,
|
||||||
type=int,
|
type=int,
|
||||||
metavar='<rotation>',
|
metavar='<rotation>',
|
||||||
help="Number of backups to retain. (for image-type daily or weekly)")
|
help="Number of backups to retain. Used for backup image_type.")
|
||||||
@arg('--name',
|
|
||||||
default=None,
|
|
||||||
metavar='<name>',
|
|
||||||
help="Name of the new snapshot")
|
|
||||||
def do_image_create(self, args):
|
def do_image_create(self, args):
|
||||||
"""Create a new image by taking a snapshot of a running server."""
|
"""Create a new image by taking a snapshot of a running server."""
|
||||||
server = self._find_server(args.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)
|
print_dict(image._info)
|
||||||
|
|
||||||
@arg('image', metavar='<image>', help='Name or ID of image.')
|
@arg('image', metavar='<image>', help='Name or ID of image.')
|
||||||
|
2
setup.py
2
setup.py
@ -11,7 +11,7 @@ if sys.version_info < (2,6):
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name = "python-novaclient",
|
name = "python-novaclient",
|
||||||
version = "2.5.6",
|
version = "2.5.7",
|
||||||
description = "Client library for OpenStack Nova API",
|
description = "Client library for OpenStack Nova API",
|
||||||
long_description = read('README.rst'),
|
long_description = read('README.rst'),
|
||||||
url = 'https://github.com/rackspace/python-novaclient',
|
url = 'https://github.com/rackspace/python-novaclient',
|
||||||
|
@ -336,7 +336,7 @@ class FakeClient(OpenStackClient):
|
|||||||
|
|
||||||
def post_images(self, body, **kw):
|
def post_images(self, body, **kw):
|
||||||
assert_equal(body.keys(), ['image'])
|
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])
|
return (202, self.get_images_1()[1])
|
||||||
|
|
||||||
def delete_images_1(self, **kw):
|
def delete_images_1(self, **kw):
|
||||||
|
@ -191,11 +191,19 @@ def test_image_list():
|
|||||||
assert_called('GET', '/images/detail')
|
assert_called('GET', '/images/detail')
|
||||||
|
|
||||||
|
|
||||||
def test_image_create():
|
def test_snapshot_create():
|
||||||
shell('image-create sample-server snapshot --name new-image')
|
shell('image-create sample-server mysnapshot')
|
||||||
assert_called(
|
assert_called(
|
||||||
'POST', '/images',
|
'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}}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user