nova flavor-show command is inconsistent

The nova flavor-show command accepts a flavor
name as its parameter. The command show inconsistency
as it works with the exact flavor name and flavor name
in all lowercase but fails for any other case pattern.

So, updated the code so that if we run the command
with flavor-name case patern it runs fine.

Closes-Bug: #1423885
Change-Id: I713bf2b5aca977df40dc745e29d4fe98a950c991
This commit is contained in:
Abhishek Talwar 2015-02-23 17:26:53 +05:30
parent bfd029c8ef
commit 4e79285b45
5 changed files with 32 additions and 21 deletions

View File

@ -36,7 +36,7 @@ class BaseTest(utils.TestCase):
def test_resource_lazy_getattr(self):
f = flavors.Flavor(cs.flavors, {'id': 1})
self.assertEqual('256 MB Server', f.name)
self.assertEqual('256 mb server', f.name)
cs.assert_called('GET', '/flavors/1')
# Missing stuff still fails after a second get

View File

@ -258,7 +258,7 @@ class FakeHTTPClient(base_client.HTTPClient):
},
"flavor": {
"id": 1,
"name": "256 MB Server",
"name": "256 mb server",
},
"hostId": "e4d909c290d0fb1ca068ffaddf22cbd0",
"status": "BUILD",
@ -299,7 +299,7 @@ class FakeHTTPClient(base_client.HTTPClient):
},
"flavor": {
"id": 1,
"name": "256 MB Server",
"name": "256 mb server",
},
"hostId": "9e107d9d372bb6826bd81d3542a419d6",
"status": "ACTIVE",
@ -340,7 +340,7 @@ class FakeHTTPClient(base_client.HTTPClient):
"image": "",
"flavor": {
"id": 1,
"name": "256 MB Server",
"name": "256 mb server",
},
"hostId": "9e107d9d372bb6826bd81d3542a419d6",
"status": "ACTIVE",
@ -697,19 +697,19 @@ class FakeHTTPClient(base_client.HTTPClient):
def get_flavors_detail(self, **kw):
flavors = {'flavors': [
{'id': 1, 'name': '256 MB Server', 'ram': 256, 'disk': 10,
{'id': 1, 'name': '256 mb server', 'ram': 256, 'disk': 10,
'OS-FLV-EXT-DATA:ephemeral': 10,
'os-flavor-access:is_public': True,
'links': {}},
{'id': 2, 'name': '512 MB Server', 'ram': 512, 'disk': 20,
{'id': 2, 'name': '512 mb server', 'ram': 512, 'disk': 20,
'OS-FLV-EXT-DATA:ephemeral': 20,
'os-flavor-access:is_public': False,
'links': {}},
{'id': 4, 'name': '1024 MB Server', 'ram': 1024, 'disk': 10,
{'id': 4, 'name': '1024 mb server', 'ram': 1024, 'disk': 10,
'OS-FLV-EXT-DATA:ephemeral': 10,
'os-flavor-access:is_public': True,
'links': {}},
{'id': 'aa1', 'name': '128 MB Server', 'ram': 128, 'disk': 0,
{'id': 'aa1', 'name': '128 mb server', 'ram': 128, 'disk': 0,
'OS-FLV-EXT-DATA:ephemeral': 0,
'os-flavor-access:is_public': True,
'links': {}}
@ -761,16 +761,16 @@ class FakeHTTPClient(base_client.HTTPClient):
{},
{'flavor': {
'id': 3,
'name': '256 MB Server',
'name': '256 mb server',
'ram': 256,
'disk': 10,
}},
)
def get_flavors_512_MB_Server(self, **kw):
def get_flavors_512_mb_server(self, **kw):
raise exceptions.NotFound('404')
def get_flavors_128_MB_Server(self, **kw):
def get_flavors_128_mb_server(self, **kw):
raise exceptions.NotFound('404')
def get_flavors_aa1(self, **kw):

View File

@ -93,10 +93,10 @@ class FlavorsTest(utils.TestCase):
def test_find(self):
f = self.cs.flavors.find(ram=256)
self.cs.assert_called('GET', '/flavors/detail')
self.assertEqual('256 MB Server', f.name)
self.assertEqual('256 mb server', f.name)
f = self.cs.flavors.find(disk=0)
self.assertEqual('128 MB Server', f.name)
self.assertEqual('128 mb server', f.name)
self.assertRaises(exceptions.NotFound, self.cs.flavors.find,
disk=12345)

View File

@ -661,10 +661,10 @@ class ShellTest(utils.TestCase):
def test_boot_named_flavor(self):
self.run_command(["boot", "--image", "1",
"--flavor", "512 MB Server",
"--flavor", "512 mb server",
"--max-count", "3", "server"])
self.assert_called('GET', '/images/1', pos=0)
self.assert_called('GET', '/flavors/512 MB Server', pos=1)
self.assert_called('GET', '/flavors/512 mb server', pos=1)
self.assert_called('GET', '/flavors?is_public=None', pos=2)
self.assert_called('GET', '/flavors/2', pos=3)
self.assert_called(
@ -701,15 +701,15 @@ class ShellTest(utils.TestCase):
self.assert_called_anytime('GET', '/flavors/aa1')
def test_flavor_show_by_name(self):
self.run_command(['flavor-show', '128 MB Server'])
self.assert_called('GET', '/flavors/128 MB Server', pos=0)
self.run_command(['flavor-show', '128 mb server'])
self.assert_called('GET', '/flavors/128 mb server', pos=0)
self.assert_called('GET', '/flavors?is_public=None', pos=1)
self.assert_called('GET', '/flavors/aa1', pos=2)
self.assert_called('GET', '/flavors/aa1/os-extra_specs', pos=3)
def test_flavor_show_by_name_priv(self):
self.run_command(['flavor-show', '512 MB Server'])
self.assert_called('GET', '/flavors/512 MB Server', pos=0)
self.run_command(['flavor-show', '512 mb server'])
self.assert_called('GET', '/flavors/512 mb server', pos=0)
self.assert_called('GET', '/flavors?is_public=None', pos=1)
self.assert_called('GET', '/flavors/2', pos=2)
self.assert_called('GET', '/flavors/2/os-extra_specs', pos=3)
@ -746,7 +746,7 @@ class ShellTest(utils.TestCase):
{'addTenantAccess': {'tenant': 'proj2'}})
def test_flavor_access_add_by_name(self):
self.run_command(['flavor-access-add', '512 MB Server', 'proj2'])
self.run_command(['flavor-access-add', '512 mb server', 'proj2'])
self.assert_called('POST', '/flavors/2/action',
{'addTenantAccess': {'tenant': 'proj2'}})
@ -756,7 +756,7 @@ class ShellTest(utils.TestCase):
{'removeTenantAccess': {'tenant': 'proj2'}})
def test_flavor_access_remove_by_name(self):
self.run_command(['flavor-access-remove', '512 MB Server', 'proj2'])
self.run_command(['flavor-access-remove', '512 mb server', 'proj2'])
self.assert_called('POST', '/flavors/2/action',
{'removeTenantAccess': {'tenant': 'proj2'}})

View File

@ -1897,6 +1897,17 @@ def _find_image(cs, image):
def _find_flavor(cs, flavor):
"""Get a flavor by name, ID, or RAM size."""
try:
# isinstance() is being used to check if flavor is an instance of
# integer. It will help us to check if the user has entered flavor
# name or flavorid. If flavor name has been entered it is being
# converted to lowercase using lower(). Incase it is an ID the user
# has passed it will not go through the "flavor = flavor.lower()"
# code.The reason for checking if it is a flavor name or flavorid is
# that int has no lower() so it will give an error.
if isinstance(flavor, six.integer_types):
pass
else:
flavor = flavor.lower()
return utils.find_resource(cs.flavors, flavor, is_public=None)
except exceptions.NotFound:
return cs.flavors.find(ram=flavor)