Make "flavor show" command to show a private flavor properly

The "flavor show" command could not show a
private flavor by flavor name becauce it could
not find a private flavor by flavor name.
In "until.find_resource(parsed_args.flavor)",
If parsed_args.falvor is a name of a flavor,
"flavors.find(name=parsed_args.flavor)"will be
called to find a flavor.But the default value of
"is_public" is "Ture" in "flavors.find()" so that
we can only find public flavors.If we want to find
all flaovrs by flavor name,we should add
"is_public=None" in "flavors.find()".

So I tried to change
"until.find_resource(parsed_args.flavor)" to
"until.find_resource(parsed_args.flavor, is_public=None)",
but then I could not find any flavor by flavor id
because "is_public" is an unexpected argument of
"flavors.get()" in "until.find_resource()".

In this case,I think "until.find_resource()"
can not find a private flavor properly,and
we should combine "manager.get(flavor.id)" and
"manager.find(name=flavor.name, is_public=None)"
by ourselve to find a flavor.

Also,this bug affects other flavor commands like
"flavor set/unset/delete",so I fix them in this patch too.

Change-Id: I4a4ed7b0a2f522ee04d1c3270afcda7064285c39
Closes-Bug: #1575478
This commit is contained in:
Huanxuan Ao 2016-05-02 16:30:29 +08:00
parent 9ec41c0397
commit 681d6dc2de
3 changed files with 37 additions and 21 deletions

View File

@ -18,10 +18,29 @@
import six import six
from openstackclient.common import command from openstackclient.common import command
from openstackclient.common import exceptions
from openstackclient.common import parseractions from openstackclient.common import parseractions
from openstackclient.common import utils from openstackclient.common import utils
def _find_flavor(compute_client, flavor):
try:
return compute_client.flavors.get(flavor)
except Exception as ex:
if type(ex).__name__ == 'NotFound':
pass
else:
raise
try:
return compute_client.flavors.find(name=flavor, is_public=None)
except Exception as ex:
if type(ex).__name__ == 'NotFound':
msg = "No flavor with a name or ID of '%s' exists." % flavor
raise exceptions.CommandError(msg)
else:
raise
class CreateFlavor(command.ShowOne): class CreateFlavor(command.ShowOne):
"""Create new flavor""" """Create new flavor"""
@ -132,8 +151,7 @@ class DeleteFlavor(command.Command):
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute compute_client = self.app.client_manager.compute
flavor = utils.find_resource(compute_client.flavors, flavor = _find_flavor(compute_client, parsed_args.flavor)
parsed_args.flavor)
compute_client.flavors.delete(flavor.id) compute_client.flavors.delete(flavor.id)
@ -239,8 +257,7 @@ class SetFlavor(command.Command):
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute compute_client = self.app.client_manager.compute
flavor = utils.find_resource(compute_client.flavors, flavor = _find_flavor(compute_client, parsed_args.flavor)
parsed_args.flavor)
flavor.set_keys(parsed_args.property) flavor.set_keys(parsed_args.property)
@ -258,8 +275,7 @@ class ShowFlavor(command.ShowOne):
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute compute_client = self.app.client_manager.compute
resource_flavor = utils.find_resource(compute_client.flavors, resource_flavor = _find_flavor(compute_client, parsed_args.flavor)
parsed_args.flavor)
flavor = resource_flavor._info.copy() flavor = resource_flavor._info.copy()
flavor.pop("links", None) flavor.pop("links", None)
@ -290,6 +306,5 @@ class UnsetFlavor(command.Command):
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute compute_client = self.app.client_manager.compute
flavor = utils.find_resource(compute_client.flavors, flavor = _find_flavor(compute_client, parsed_args.flavor)
parsed_args.flavor)
flavor.unset_keys(parsed_args.property) flavor.unset_keys(parsed_args.property)

View File

@ -273,7 +273,7 @@ class TestFlavorSet(TestFlavor):
super(TestFlavorSet, self).setUp() super(TestFlavorSet, self).setUp()
self.flavors_mock.find.return_value = self.flavor self.flavors_mock.find.return_value = self.flavor
self.flavors_mock.get.side_effect = exceptions.NotFound(None)
self.cmd = flavor.SetFlavor(self.app, None) self.cmd = flavor.SetFlavor(self.app, None)
def test_flavor_set(self): def test_flavor_set(self):
@ -288,10 +288,8 @@ class TestFlavorSet(TestFlavor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
try: self.flavors_mock.find.assert_called_with(name=parsed_args.flavor,
self.flavors_mock.find.assert_called_with(name=parsed_args.flavor) is_public=None)
except Exception:
self.flavors_mock.get.assert_called_with(parsed_args.flavor)
self.assertIsNone(result) self.assertIsNone(result)
@ -331,9 +329,9 @@ class TestFlavorShow(TestFlavor):
def setUp(self): def setUp(self):
super(TestFlavorShow, self).setUp() super(TestFlavorShow, self).setUp()
# Return value of utils.find_resource() # Return value of _find_resource()
self.flavors_mock.get.return_value = self.flavor self.flavors_mock.find.return_value = self.flavor
self.flavors_mock.get.side_effect = exceptions.NotFound(None)
self.cmd = flavor.ShowFlavor(self.app, None) self.cmd = flavor.ShowFlavor(self.app, None)
def test_show_no_options(self): def test_show_no_options(self):
@ -369,7 +367,7 @@ class TestFlavorUnset(TestFlavor):
super(TestFlavorUnset, self).setUp() super(TestFlavorUnset, self).setUp()
self.flavors_mock.find.return_value = self.flavor self.flavors_mock.find.return_value = self.flavor
self.flavors_mock.get.side_effect = exceptions.NotFound(None)
self.cmd = flavor.UnsetFlavor(self.app, None) self.cmd = flavor.UnsetFlavor(self.app, None)
def test_flavor_unset(self): def test_flavor_unset(self):
@ -384,8 +382,6 @@ class TestFlavorUnset(TestFlavor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
try: self.flavors_mock.find.assert_called_with(name=parsed_args.flavor,
self.flavors_mock.find.assert_called_with(name=parsed_args.flavor) is_public=None)
except Exception:
self.flavors_mock.get.assert_called_with(parsed_args.flavor)
self.assertIsNone(result) self.assertIsNone(result)

View File

@ -0,0 +1,5 @@
---
fixes:
- Fixed ``flavor show/delete/set/unset`` command to properly
find a private flavor by flavor name.
[Bug `1575478 <https://bugs.launchpad.net/bugs/1575478>`_]