Merge "Add flavor create/delete support"
This commit is contained in:
commit
2f293a4144
|
@ -83,6 +83,8 @@ You'll find complete documentation on the shell by running
|
||||||
Delete the backup schedule for a server.
|
Delete the backup schedule for a server.
|
||||||
boot Boot a new server.
|
boot Boot a new server.
|
||||||
delete Immediately shut down and delete a 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
|
flavor-list Print a list of available 'flavors' (sizes of
|
||||||
servers).
|
servers).
|
||||||
floating-ip-create Allocate a floating IP to the current tenant.
|
floating-ip-create Allocate a floating IP to the current tenant.
|
||||||
|
|
|
@ -39,3 +39,41 @@ class FlavorManager(base.ManagerWithFind):
|
||||||
:rtype: :class:`Flavor`
|
:rtype: :class:`Flavor`
|
||||||
"""
|
"""
|
||||||
return self._get("/flavors/%s" % base.getid(flavor), "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")
|
||||||
|
|
|
@ -294,9 +294,7 @@ def _translate_flavor_keys(collection):
|
||||||
setattr(item, to_key, item._info[from_key])
|
setattr(item, to_key, item._info[from_key])
|
||||||
|
|
||||||
|
|
||||||
def do_flavor_list(cs, args):
|
def _print_flavor_list(flavors):
|
||||||
"""Print a list of available 'flavors' (sizes of servers)."""
|
|
||||||
flavors = cs.flavors.list()
|
|
||||||
_translate_flavor_keys(flavors)
|
_translate_flavor_keys(flavors)
|
||||||
utils.print_list(flavors, [
|
utils.print_list(flavors, [
|
||||||
'ID',
|
'ID',
|
||||||
|
@ -308,6 +306,50 @@ def do_flavor_list(cs, args):
|
||||||
'RXTX_Factor'])
|
'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):
|
def do_image_list(cs, args):
|
||||||
"""Print a list of available images to boot from."""
|
"""Print a list of available images to boot from."""
|
||||||
image_list = cs.images.list()
|
image_list = cs.images.list()
|
||||||
|
|
|
@ -348,6 +348,12 @@ class FakeHTTPClient(base_client.HTTPClient):
|
||||||
def get_flavors_2(self, **kw):
|
def get_flavors_2(self, **kw):
|
||||||
return (200, {'flavor': self.get_flavors_detail()[1]['flavors'][1]})
|
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
|
# Floating ips
|
||||||
#
|
#
|
||||||
|
|
|
@ -35,3 +35,25 @@ class FlavorsTest(utils.TestCase):
|
||||||
self.assertEqual(f.name, '512 MB Server')
|
self.assertEqual(f.name, '512 MB Server')
|
||||||
|
|
||||||
self.assertRaises(exceptions.NotFound, cs.flavors.find, disk=12345)
|
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')
|
||||||
|
|
|
@ -328,3 +328,26 @@ class ShellTest(utils.TestCase):
|
||||||
'start=2000-01-20T00:00:00&' +
|
'start=2000-01-20T00:00:00&' +
|
||||||
'end=2005-02-01T00:00:00&' +
|
'end=2005-02-01T00:00:00&' +
|
||||||
'detailed=1')
|
'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')
|
||||||
|
|
Loading…
Reference in New Issue