From ee411a6a2ecbd8063e9088ac3e60075d6812c246 Mon Sep 17 00:00:00 2001 From: Kaushik Chandrashekar Date: Mon, 10 Jun 2013 14:15:06 +0530 Subject: [PATCH] Cells Support Adding support for Cell show and Cell capacities calls Implements: blueprint cell-capacity Change-Id: I83243cf224a4487d720d55d8942d28c52924b734 --- novaclient/tests/v1_1/contrib/test_cells.py | 42 +++++++++++++ novaclient/tests/v1_1/fakes.py | 29 +++++++++ novaclient/tests/v1_1/test_shell.py | 12 ++++ novaclient/utils.py | 4 +- novaclient/v1_1/contrib/cells.py | 69 +++++++++++++++++++++ 5 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 novaclient/tests/v1_1/contrib/test_cells.py create mode 100644 novaclient/v1_1/contrib/cells.py diff --git a/novaclient/tests/v1_1/contrib/test_cells.py b/novaclient/tests/v1_1/contrib/test_cells.py new file mode 100644 index 000000000..187fab847 --- /dev/null +++ b/novaclient/tests/v1_1/contrib/test_cells.py @@ -0,0 +1,42 @@ +# Copyright 2013 Rackspace Hosting +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from novaclient import extension +from novaclient.tests import utils +from novaclient.tests.v1_1.contrib import fakes +from novaclient.v1_1.contrib import cells + + +extensions = [ + extension.Extension(cells.__name__.split(".")[-1], + cells), +] +cs = fakes.FakeClient(extensions=extensions) + + +class CellsExtensionTests(utils.TestCase): + def test_get_cells(self): + cell_name = 'child_cell' + cs.cells.get(cell_name) + cs.assert_called('GET', '/os-cells/%s' % cell_name) + + def test_get_capacities_for_a_given_cell(self): + cell_name = 'child_cell' + cs.cells.capacities(cell_name) + cs.assert_called('GET', '/os-cells/%s/capacities' % cell_name) + + def test_get_capacities_for_all_cells(self): + cs.cells.capacities() + cs.assert_called('GET', '/os-cells/capacities') diff --git a/novaclient/tests/v1_1/fakes.py b/novaclient/tests/v1_1/fakes.py index 9cbcd518e..fb103ae24 100644 --- a/novaclient/tests/v1_1/fakes.py +++ b/novaclient/tests/v1_1/fakes.py @@ -1714,3 +1714,32 @@ class FakeHTTPClient(base_client.HTTPClient): def post_servers_uuid4_action(self, **kw): return 202, {}, {} + + def get_os_cells_child_cell(self, **kw): + cell = {'cell': { + 'username': 'cell1_user', + 'name': 'cell1', + 'rpc_host': '10.0.1.10', + '_info': { + 'username': 'cell1_user', + 'rpc_host': '10.0.1.10', + 'type': 'child', + 'name': 'cell1', + 'rpc_port': 5673 + }, + 'type': 'child', + 'rpc_port': 5673, + '_loaded': True + }} + return (200, {}, cell) + + def get_os_cells_capacities(self, **kw): + cell_capacities_response = {"cell": {"capacities": {"ram_free": { + "units_by_mb": {"8192": 0, "512": 13, "4096": 1, "2048": 3, + "16384": 0}, "total_mb": 7680}, "disk_free": { + "units_by_mb": {"81920": 11, "20480": 46, "40960": 23, "163840": 5, + "0": 0}, "total_mb": 1052672}}}} + return (200, {}, cell_capacities_response) + + def get_os_cells_child_cell_capacities(self, **kw): + return self.get_os_cells_capacities() diff --git a/novaclient/tests/v1_1/test_shell.py b/novaclient/tests/v1_1/test_shell.py index 0ac3ecc3f..c374bdf87 100644 --- a/novaclient/tests/v1_1/test_shell.py +++ b/novaclient/tests/v1_1/test_shell.py @@ -1377,3 +1377,15 @@ class ShellTest(utils.TestCase): self.run_command('instance-action sample-server req-abcde12345') self.assert_called('GET', '/servers/1234/os-instance-actions/req-abcde12345') + + def test_cell_show(self): + self.run_command('cell-show child_cell') + self.assert_called('GET', '/os-cells/child_cell') + + def test_cell_capacities_with_cell_name(self): + self.run_command('cell-capacities --cell child_cell') + self.assert_called('GET', '/os-cells/child_cell/capacities') + + def test_cell_capacities_without_cell_name(self): + self.run_command('cell-capacities') + self.assert_called('GET', '/os-cells/capacities') diff --git a/novaclient/utils.py b/novaclient/utils.py index f8f4b575d..d1e08e961 100644 --- a/novaclient/utils.py +++ b/novaclient/utils.py @@ -169,8 +169,8 @@ def print_list(objs, fields, formatters={}, sortby_index=None): print(strutils.safe_encode(pt.get_string())) -def print_dict(d, dict_property="Property", wrap=0): - pt = prettytable.PrettyTable([dict_property, 'Value'], caching=False) +def print_dict(d, dict_property="Property", dict_value="Value", wrap=0): + pt = prettytable.PrettyTable([dict_property, dict_value], caching=False) pt.align = 'l' for k, v in d.iteritems(): # convert dict to str to check length diff --git a/novaclient/v1_1/contrib/cells.py b/novaclient/v1_1/contrib/cells.py new file mode 100644 index 000000000..a6cd78a4e --- /dev/null +++ b/novaclient/v1_1/contrib/cells.py @@ -0,0 +1,69 @@ +# Copyright 2013 Rackspace Hosting +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from novaclient import base +from novaclient import utils + + +class Cell(base.Resource): + def __repr__(self): + return "" % self.name + + +class CellsManager(base.Manager): + resource_class = Cell + + def get(self, cell_name): + """ + Get a cell. + + :param cell: Name of the :class:`Cell` to get. + :rtype: :class:`Cell` + """ + return self._get("/os-cells/%s" % cell_name, "cell") + + def capacities(self, cell_name=None): + """ + Get capacities for a cell. + + :param cell: Name of the :class:`Cell` to get capacities for. + :rtype: :class:`Cell` + """ + path = ["%s/capacities" % cell_name, "capacities"][cell_name is None] + return self._get("/os-cells/%s" % path, "cell") + + +@utils.arg('cell', + metavar='', + help='Name of the cell.') +def do_cell_show(cs, args): + """Show details of a given cell.""" + cell = cs.cells.get(args.cell) + utils.print_dict(cell._info) + + +@utils.arg('--cell', + metavar='', + help="Name of the cell to get the capacities.", + default=None) +def do_cell_capacities(cs, args): + """Get cell capacities for all cells or a given cell.""" + cell = cs.cells.capacities(args.cell) + print("Ram Available: %s MB" % cell.capacities['ram_free']['total_mb']) + utils.print_dict(cell.capacities['ram_free']['units_by_mb'], + dict_property='Ram(MB)', dict_value="Units") + print("\nDisk Available: %s MB" % cell.capacities['disk_free']['total_mb']) + utils.print_dict(cell.capacities['disk_free']['units_by_mb'], + dict_property='Disk(MB)', dict_value="Units")