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
from openstackclient.common import command
from openstackclient.common import exceptions
from openstackclient.common import parseractions
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):
"""Create new flavor"""
@ -132,8 +151,7 @@ class DeleteFlavor(command.Command):
def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute
flavor = utils.find_resource(compute_client.flavors,
parsed_args.flavor)
flavor = _find_flavor(compute_client, parsed_args.flavor)
compute_client.flavors.delete(flavor.id)
@ -239,8 +257,7 @@ class SetFlavor(command.Command):
def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute
flavor = utils.find_resource(compute_client.flavors,
parsed_args.flavor)
flavor = _find_flavor(compute_client, parsed_args.flavor)
flavor.set_keys(parsed_args.property)
@ -258,8 +275,7 @@ class ShowFlavor(command.ShowOne):
def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute
resource_flavor = utils.find_resource(compute_client.flavors,
parsed_args.flavor)
resource_flavor = _find_flavor(compute_client, parsed_args.flavor)
flavor = resource_flavor._info.copy()
flavor.pop("links", None)
@ -290,6 +306,5 @@ class UnsetFlavor(command.Command):
def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute
flavor = utils.find_resource(compute_client.flavors,
parsed_args.flavor)
flavor = _find_flavor(compute_client, parsed_args.flavor)
flavor.unset_keys(parsed_args.property)

View File

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