Add flavor create/delete support

Makes use of the new nova module for flavor creation/deletion (still
under review at https://review.openstack.org/#change,3197

tests and cli commands added.

v2:
    Fix tests
    Fix pep8 violations

v3:
    Drop unused import

v4:
    Usage defaults to end date 'tomorrow'

v5:
    Undo unintentional change

v6:
    Drop useless comment
    Fix meta var name for flavor-delete command

Change-Id: I14baa02d5cbe5eaf17875c285c993508b1671a13
This commit is contained in:
Cole Robinson 2012-01-19 19:57:04 -05:00
parent c3b043be0e
commit 65eb4a9fb2
6 changed files with 136 additions and 3 deletions

View File

@ -83,6 +83,8 @@ You'll find complete documentation on the shell by running
Delete the backup schedule for a server.
boot Boot a new server.
delete Immediately shut down and delete a server.
flavor-create Create a new flavor
flavor-delete Delete a specific flavor
flavor-list Print a list of available 'flavors' (sizes of
servers).
floating-ip-create Allocate a floating IP to the current tenant.

View File

@ -39,3 +39,41 @@ class FlavorManager(base.ManagerWithFind):
:rtype: :class:`Flavor`
"""
return self._get("/flavors/%s" % base.getid(flavor), "flavor")
def delete(self, flavor):
"""
Delete a specific flavor.
:param flavor: The ID of the :class:`Flavor` to get.
:param purge: Whether to purge record from the database
"""
self._delete("/flavors/%s" % base.getid(flavor))
def create(self, name, ram, vcpus, disk, flavorid,
swap=0, rxtx_factor=1):
"""
Create (allocate) a floating ip for a tenant
:param name: Descriptive name of the flavor
:param ram: Memory in MB for the flavor
:param vcpu: Number of VCPUs for the flavor
:param disk: Size of local disk in GB
:param flavorid: Integer ID for the flavor
:param swap: Swap space in MB
:param rxtx_factor: RX/TX factor
:rtype: :class:`Flavor`
"""
body = {
"flavor": {
"name": name,
"ram": int(ram),
"vcpus": int(vcpus),
"disk": int(disk),
"id": int(flavorid),
"swap": int(swap),
"rxtx_factor": int(rxtx_factor),
}
}
return self._create("/flavors", body, "flavor")

View File

@ -294,9 +294,7 @@ def _translate_flavor_keys(collection):
setattr(item, to_key, item._info[from_key])
def do_flavor_list(cs, args):
"""Print a list of available 'flavors' (sizes of servers)."""
flavors = cs.flavors.list()
def _print_flavor_list(flavors):
_translate_flavor_keys(flavors)
utils.print_list(flavors, [
'ID',
@ -308,6 +306,50 @@ def do_flavor_list(cs, args):
'RXTX_Factor'])
def do_flavor_list(cs, args):
"""Print a list of available 'flavors' (sizes of servers)."""
flavors = cs.flavors.list()
_print_flavor_list(flavors)
@utils.arg('id',
metavar='<id>',
help="Unique ID of the flavor to delete")
def do_flavor_delete(cs, args):
"""Delete a specific flavor"""
cs.flavors.delete(args.id)
@utils.arg('name',
metavar='<name>',
help="Name of the new flavor")
@utils.arg('id',
metavar='<id>',
help="Unique integer ID for the new flavor")
@utils.arg('ram',
metavar='<ram>',
help="Memory size in MB")
@utils.arg('disk',
metavar='<disk>',
help="Disk size in GB")
@utils.arg('vcpus',
metavar='<vcpus>',
help="Number of vcpus")
@utils.arg('--swap',
metavar='<swap>',
help="Swap space size in MB (default 0)",
default=0)
@utils.arg('--rxtx-factor',
metavar='<factor>',
help="RX/TX factor (default 1)",
default=1)
def do_flavor_create(cs, args):
"""Create a new flavor"""
f = cs.flavors.create(args.name, args.ram, args.vcpus, args.disk, args.id,
args.swap, args.rxtx_factor)
_print_flavor_list([f])
def do_image_list(cs, args):
"""Print a list of available images to boot from."""
image_list = cs.images.list()

View File

@ -348,6 +348,12 @@ class FakeHTTPClient(base_client.HTTPClient):
def get_flavors_2(self, **kw):
return (200, {'flavor': self.get_flavors_detail()[1]['flavors'][1]})
def delete_flavors_flavordelete(self, **kw):
return (202, None)
def post_flavors(self, body, **kw):
return (202, {'flavor': self.get_flavors_detail()[1]['flavors'][0]})
#
# Floating ips
#

View File

@ -35,3 +35,25 @@ class FlavorsTest(utils.TestCase):
self.assertEqual(f.name, '512 MB Server')
self.assertRaises(exceptions.NotFound, cs.flavors.find, disk=12345)
def test_create(self):
f = cs.flavors.create("flavorcreate", 512, 1, 10, 1234)
body = {
"flavor": {
"name": "flavorcreate",
"ram": 512,
"vcpus": 1,
"disk": 10,
"id": 1234,
"swap": 0,
"rxtx_factor": 1,
}
}
cs.assert_called('POST', '/flavors', body)
self.assertTrue(isinstance(f, flavors.Flavor))
def test_delete(self):
cs.flavors.delete("flavordelete")
cs.assert_called('DELETE', '/flavors/flavordelete')

View File

@ -328,3 +328,26 @@ class ShellTest(utils.TestCase):
'start=2000-01-20T00:00:00&' +
'end=2005-02-01T00:00:00&' +
'detailed=1')
def test_flavor_delete(self):
self.run_command("flavor-delete flavordelete")
self.assert_called('DELETE', '/flavors/flavordelete')
def test_flavor_create(self):
self.run_command("flavor-create flavorcreate "
"1234 512 10 1 --swap 1024")
body = {
"flavor": {
"name": "flavorcreate",
"ram": 512,
"vcpus": 1,
"disk": 10,
"id": 1234,
"swap": 1024,
"rxtx_factor": 1,
}
}
self.assert_called('POST', '/flavors', body, pos=-2)
self.assert_called('GET', '/flavors/1')