diff --git a/novaclient/v1_1/flavors.py b/novaclient/v1_1/flavors.py index b8aef6ea5..267bd2da3 100644 --- a/novaclient/v1_1/flavors.py +++ b/novaclient/v1_1/flavors.py @@ -2,6 +2,7 @@ """ Flavor interface. """ +import urllib from novaclient import base from novaclient import exceptions @@ -76,16 +77,25 @@ class FlavorManager(base.ManagerWithFind): resource_class = Flavor is_alphanum_id_allowed = True - def list(self, detailed=True): + def list(self, detailed=True, is_public=True): """ Get a list of all flavors. :rtype: list of :class:`Flavor`. """ - if detailed is True: - return self._list("/flavors/detail", "flavors") - else: - return self._list("/flavors", "flavors") + qparams = {} + # is_public is ternary - None means give all flavors. + # By default Nova assumes True and gives admins public flavors + # and flavors from their own projects only. + if not is_public: + qparams['is_public'] = is_public + query_string = "?%s" % urllib.urlencode(qparams) if qparams else "" + + detail = "" + if detailed: + detail = "/detail" + + return self._list("/flavors%s%s" % (detail, query_string), "flavors") def get(self, flavor): """ diff --git a/novaclient/v1_1/shell.py b/novaclient/v1_1/shell.py index b138c0b1f..cb638896a 100644 --- a/novaclient/v1_1/shell.py +++ b/novaclient/v1_1/shell.py @@ -420,9 +420,17 @@ def _print_flavor_list(cs, flavors, show_extra_specs=False): action='store_true', default=False, help='Get extra-specs of each flavor.') +@utils.arg('--all', + dest='all', + action='store_true', + default=False, + help='Display all flavors (Admin only).') def do_flavor_list(cs, args): """Print a list of available 'flavors' (sizes of servers).""" - flavors = cs.flavors.list() + if args.all: + flavors = cs.flavors.list(is_public=None) + else: + flavors = cs.flavors.list() _print_flavor_list(cs, flavors, args.extra_specs) diff --git a/tests/v1_1/test_flavors.py b/tests/v1_1/test_flavors.py index 084e34afd..936035330 100644 --- a/tests/v1_1/test_flavors.py +++ b/tests/v1_1/test_flavors.py @@ -12,12 +12,20 @@ class FlavorsTest(utils.TestCase): def test_list_flavors(self): fl = cs.flavors.list() cs.assert_called('GET', '/flavors/detail') - [self.assertTrue(isinstance(f, flavors.Flavor)) for f in fl] + for flavor in fl: + self.assertTrue(isinstance(flavor, flavors.Flavor)) def test_list_flavors_undetailed(self): fl = cs.flavors.list(detailed=False) cs.assert_called('GET', '/flavors') - [self.assertTrue(isinstance(f, flavors.Flavor)) for f in fl] + for flavor in fl: + self.assertTrue(isinstance(flavor, flavors.Flavor)) + + def test_list_flavors_is_public(self): + fl = cs.flavors.list(is_public=None) + cs.assert_called('GET', '/flavors/detail?is_public=None') + for flavor in fl: + self.assertTrue(isinstance(flavor, flavors.Flavor)) def test_get_flavor_details(self): f = cs.flavors.get(1) diff --git a/tests/v1_1/test_shell.py b/tests/v1_1/test_shell.py index f397a30ae..27d237ef9 100644 --- a/tests/v1_1/test_shell.py +++ b/tests/v1_1/test_shell.py @@ -397,6 +397,10 @@ class ShellTest(utils.TestCase): self.assert_called('GET', '/flavors/aa1/os-extra_specs') self.assert_called_anytime('GET', '/flavors/detail') + def test_flavor_list_with_all(self): + self.run_command('flavor-list --all') + self.assert_called('GET', '/flavors/detail?is_public=None') + def test_flavor_show(self): self.run_command('flavor-show 1') self.assert_called_anytime('GET', '/flavors/1')