From c47d8c36a761be5d2a98b2fda230e311e81b238b Mon Sep 17 00:00:00 2001 From: Sushil Kumar Date: Mon, 2 Sep 2013 20:50:36 +0000 Subject: [PATCH] Adds support for admin to create flavors through mgmt API Extending the management API to allow for an admin to create flavors categorized on service type in trove. Change-Id: I8d5910e6dd9e497d1a8be4ffd58aa339d12db74f Implements: blueprint service-type-filter-on-flavors --- troveclient/__init__.py | 1 + troveclient/client.py | 2 ++ troveclient/management.py | 39 ++++++++++++++++++++++++++++ troveclient/mcli.py | 26 +++++++++++++++++++ troveclient/tests/test_management.py | 32 +++++++++++++++++++++++ 5 files changed, 100 insertions(+) diff --git a/troveclient/__init__.py b/troveclient/__init__.py index f4b2d277..2d14bbd7 100644 --- a/troveclient/__init__.py +++ b/troveclient/__init__.py @@ -21,6 +21,7 @@ from troveclient.instances import Instances # noqa from troveclient.hosts import Hosts # noqa from troveclient.management import Management # noqa from troveclient.management import RootHistory # noqa +from troveclient.management import MgmtFlavors # noqa from troveclient.root import Root # noqa from troveclient.storage import StorageInfo # noqa from troveclient.users import Users # noqa diff --git a/troveclient/client.py b/troveclient/client.py index 335daa4a..bca246d7 100644 --- a/troveclient/client.py +++ b/troveclient/client.py @@ -313,6 +313,7 @@ class Dbaas(object): from troveclient.security_groups import SecurityGroupRules from troveclient.storage import StorageInfo from troveclient.management import Management + from troveclient.management import MgmtFlavors from troveclient.accounts import Accounts from troveclient.diagnostics import DiagnosticsInterrogator from troveclient.diagnostics import HwInfoInterrogator @@ -338,6 +339,7 @@ class Dbaas(object): self.security_group_rules = SecurityGroupRules(self) self.storage = StorageInfo(self) self.management = Management(self) + self.mgmt_flavor = MgmtFlavors(self) self.accounts = Accounts(self) self.diagnostics = DiagnosticsInterrogator(self) self.hwinfo = HwInfoInterrogator(self) diff --git a/troveclient/management.py b/troveclient/management.py index 1e17f92e..4613e573 100644 --- a/troveclient/management.py +++ b/troveclient/management.py @@ -20,6 +20,7 @@ from troveclient.common import check_for_exceptions from troveclient.common import limit_url from troveclient.common import Paginated from troveclient.instances import Instance +from troveclient.flavors import Flavor class RootHistory(base.Resource): @@ -134,3 +135,41 @@ class Management(base.ManagerWithFind): """ body = {'reset-task-status': {}} self._action(instance_id, body) + + +class MgmtFlavors(base.ManagerWithFind): + """ + Manage :class:`Flavor` resources. + """ + resource_class = Flavor + + def __repr__(self): + return "" % id(self) + + def create(self, name, ram, disk, vcpus, + flavorid="auto", ephemeral=None, swap=None, rxtx_factor=None, + service_type=None): + """ + Create a new flavor. + """ + body = {"flavor": { + "flavor_id": flavorid, + "name": name, + "ram": ram, + "disk": disk, + "vcpu": vcpus, + "ephemeral": 0, + "swap": 0, + "rxtx_factor": "1.0", + "is_public": "True" + }} + if ephemeral: + body["flavor"]["ephemeral"] = ephemeral + if swap: + body["flavor"]["swap"] = swap + if rxtx_factor: + body["flavor"]["rxtx_factor"] = rxtx_factor + if service_type: + body["flavor"]["service_type"] = service_type + + return self._create("/mgmt/flavors", body, "flavor") diff --git a/troveclient/mcli.py b/troveclient/mcli.py index 318d3beb..622bf70d 100644 --- a/troveclient/mcli.py +++ b/troveclient/mcli.py @@ -182,6 +182,31 @@ class StorageCommands(common.AuthedCommandsBase): self._pretty_list(self.dbaas.storage.index) +class FlavorsCommands(common.AuthedCommandsBase): + """Commands for managing Flavors""" + + params = [ + 'name', + 'ram', + 'disk', + 'vcpus', + 'flavor_id', + 'ephemeral', + 'swap', + 'rxtx_factor', + 'service_type' + ] + + def create(self): + """Create a new flavor""" + self._require('name', 'ram', 'disk', 'vcpus', + 'flavor_id', 'service_type') + self._pretty_print(self.dbaas.mgmt_flavor.create, self.name, + self.ram, self.disk, self.vcpus, self.flavor_id, + self.ephemeral, self.swap, self.rxtx_factor, + self.service_type) + + def config_options(oparser): oparser.add_option("-u", "--url", default="http://localhost:5000/v1.1", help="Auth API endpoint URL with port and version. \ @@ -195,6 +220,7 @@ COMMANDS = { 'root': RootCommands, 'storage': StorageCommands, 'quota': QuotaCommands, + 'flavor': FlavorsCommands, } diff --git a/troveclient/tests/test_management.py b/troveclient/tests/test_management.py index c04e2164..e21bd299 100644 --- a/troveclient/tests/test_management.py +++ b/troveclient/tests/test_management.py @@ -142,3 +142,35 @@ class ManagementTest(TestCase): self.management.reset_task_status(1) self.assertEqual(1, self.management._action.call_count) self.assertEqual({'reset-task-status': {}}, self.body_) + + +class MgmtFlavorsTest(TestCase): + + def setUp(self): + super(MgmtFlavorsTest, self).setUp() + self.orig__init = management.MgmtFlavors.__init__ + management.MgmtFlavors.__init__ = Mock(return_value=None) + self.flavors = management.MgmtFlavors() + self.flavors.api = Mock() + self.flavors.api.client = Mock() + self.flavors.resource_class = Mock(return_value="flavor-1") + self.orig_base_getid = base.getid + base.getid = Mock(return_value="flavor1") + + def tearDown(self): + super(MgmtFlavorsTest, self).tearDown() + management.MgmtFlavors.__init__ = self.orig__init + base.getid = self.orig_base_getid + + def test_create(self): + def side_effect_func(path, body, inst): + return path, body, inst + + self.flavors._create = Mock(side_effect=side_effect_func) + p, b, i = self.flavors.create("test-name", 1024, 30, 2, 1) + self.assertEqual("/mgmt/flavors", p) + self.assertEqual("flavor", i) + self.assertEqual("test-name", b["flavor"]["name"]) + self.assertEqual(1024, b["flavor"]["ram"]) + self.assertEqual(2, b["flavor"]["vcpu"]) + self.assertEqual(1, b["flavor"]["flavor_id"])