1 This upstream patch has been addressed in Liberty but has not yet been |
|
2 addressed in Kilo. |
|
3 |
|
4 From 098116d6a574b8dede101b257db2ff22d269c6c7 Mon Sep 17 00:00:00 2001 |
|
5 From: melanie witt <[email protected]> |
|
6 Date: Tue, 21 Apr 2015 21:32:33 +0000 |
|
7 Subject: Revert "nova flavor-show command is inconsistent" |
|
8 |
|
9 This reverts commit 4e79285b45ec1490c8e923f724cbaf4d42fe81c4. |
|
10 |
|
11 The aforementioned commit broke flavor-show for mixed case flavorids. |
|
12 The reason is a bit complex. On the nova api side, there is caching of |
|
13 db items for flavors, keyed off the flavorid retrieved from the db, |
|
14 case sensitive, unlike the db query itself. Attempts to flavor-show |
|
15 a flavor with flavorid composed of letters will fail with a 400 if |
|
16 the capitalization doesn't match. |
|
17 |
|
18 For the flavor names, they work in lowercase because the find_resource |
|
19 function falls back on a search by "human_id" after failing every other |
|
20 attempt to find the flavor, because "human_id" is a oslo-slugified |
|
21 string (all lowercase, non-word characters removed, spaces converted |
|
22 to hyphens). |
|
23 |
|
24 Closes-Bug: #1446850 |
|
25 |
|
26 Change-Id: I73247b50f5a6918167c071ccc13cd676aa2c7fec |
|
27 --- |
|
28 novaclient/tests/unit/test_base.py | 2 +- |
|
29 novaclient/tests/unit/v2/fakes.py | 20 ++++++++++---------- |
|
30 novaclient/tests/unit/v2/test_flavors.py | 4 ++-- |
|
31 novaclient/tests/unit/v2/test_shell.py | 16 ++++++++-------- |
|
32 novaclient/v2/shell.py | 11 ----------- |
|
33 5 files changed, 21 insertions(+), 32 deletions(-) |
|
34 |
|
35 diff --git a/novaclient/tests/unit/test_base.py b/novaclient/tests/unit/test_base.py |
|
36 index 1ba1d32..b7bceb7 100644 |
|
37 --- a/novaclient/tests/unit/test_base.py |
|
38 +++ b/novaclient/tests/unit/test_base.py |
|
39 @@ -36,7 +36,7 @@ class BaseTest(utils.TestCase): |
|
40 |
|
41 def test_resource_lazy_getattr(self): |
|
42 f = flavors.Flavor(cs.flavors, {'id': 1}) |
|
43 - self.assertEqual('256 mb server', f.name) |
|
44 + self.assertEqual('256 MB Server', f.name) |
|
45 cs.assert_called('GET', '/flavors/1') |
|
46 |
|
47 # Missing stuff still fails after a second get |
|
48 diff --git a/novaclient/tests/unit/v2/fakes.py b/novaclient/tests/unit/v2/fakes.py |
|
49 index 343c421..40cd471 100644 |
|
50 --- a/novaclient/tests/unit/v2/fakes.py |
|
51 +++ b/novaclient/tests/unit/v2/fakes.py |
|
52 @@ -258,7 +258,7 @@ class FakeHTTPClient(base_client.HTTPClient): |
|
53 }, |
|
54 "flavor": { |
|
55 "id": 1, |
|
56 - "name": "256 mb server", |
|
57 + "name": "256 MB Server", |
|
58 }, |
|
59 "hostId": "e4d909c290d0fb1ca068ffaddf22cbd0", |
|
60 "status": "BUILD", |
|
61 @@ -299,7 +299,7 @@ class FakeHTTPClient(base_client.HTTPClient): |
|
62 }, |
|
63 "flavor": { |
|
64 "id": 1, |
|
65 - "name": "256 mb server", |
|
66 + "name": "256 MB Server", |
|
67 }, |
|
68 "hostId": "9e107d9d372bb6826bd81d3542a419d6", |
|
69 "status": "ACTIVE", |
|
70 @@ -340,7 +340,7 @@ class FakeHTTPClient(base_client.HTTPClient): |
|
71 "image": "", |
|
72 "flavor": { |
|
73 "id": 1, |
|
74 - "name": "256 mb server", |
|
75 + "name": "256 MB Server", |
|
76 }, |
|
77 "hostId": "9e107d9d372bb6826bd81d3542a419d6", |
|
78 "status": "ACTIVE", |
|
79 @@ -672,19 +672,19 @@ class FakeHTTPClient(base_client.HTTPClient): |
|
80 |
|
81 def get_flavors_detail(self, **kw): |
|
82 flavors = {'flavors': [ |
|
83 - {'id': 1, 'name': '256 mb server', 'ram': 256, 'disk': 10, |
|
84 + {'id': 1, 'name': '256 MB Server', 'ram': 256, 'disk': 10, |
|
85 'OS-FLV-EXT-DATA:ephemeral': 10, |
|
86 'os-flavor-access:is_public': True, |
|
87 'links': {}}, |
|
88 - {'id': 2, 'name': '512 mb server', 'ram': 512, 'disk': 20, |
|
89 + {'id': 2, 'name': '512 MB Server', 'ram': 512, 'disk': 20, |
|
90 'OS-FLV-EXT-DATA:ephemeral': 20, |
|
91 'os-flavor-access:is_public': False, |
|
92 'links': {}}, |
|
93 - {'id': 4, 'name': '1024 mb server', 'ram': 1024, 'disk': 10, |
|
94 + {'id': 4, 'name': '1024 MB Server', 'ram': 1024, 'disk': 10, |
|
95 'OS-FLV-EXT-DATA:ephemeral': 10, |
|
96 'os-flavor-access:is_public': True, |
|
97 'links': {}}, |
|
98 - {'id': 'aa1', 'name': '128 mb server', 'ram': 128, 'disk': 0, |
|
99 + {'id': 'aa1', 'name': '128 MB Server', 'ram': 128, 'disk': 0, |
|
100 'OS-FLV-EXT-DATA:ephemeral': 0, |
|
101 'os-flavor-access:is_public': True, |
|
102 'links': {}} |
|
103 @@ -736,16 +736,16 @@ class FakeHTTPClient(base_client.HTTPClient): |
|
104 {}, |
|
105 {'flavor': { |
|
106 'id': 3, |
|
107 - 'name': '256 mb server', |
|
108 + 'name': '256 MB Server', |
|
109 'ram': 256, |
|
110 'disk': 10, |
|
111 }}, |
|
112 ) |
|
113 |
|
114 - def get_flavors_512_mb_server(self, **kw): |
|
115 + def get_flavors_512_MB_Server(self, **kw): |
|
116 raise exceptions.NotFound('404') |
|
117 |
|
118 - def get_flavors_128_mb_server(self, **kw): |
|
119 + def get_flavors_128_MB_Server(self, **kw): |
|
120 raise exceptions.NotFound('404') |
|
121 |
|
122 def get_flavors_aa1(self, **kw): |
|
123 diff --git a/novaclient/tests/unit/v2/test_flavors.py b/novaclient/tests/unit/v2/test_flavors.py |
|
124 index 5045902..4fe43c1 100644 |
|
125 --- a/novaclient/tests/unit/v2/test_flavors.py |
|
126 +++ b/novaclient/tests/unit/v2/test_flavors.py |
|
127 @@ -93,10 +93,10 @@ class FlavorsTest(utils.TestCase): |
|
128 def test_find(self): |
|
129 f = self.cs.flavors.find(ram=256) |
|
130 self.cs.assert_called('GET', '/flavors/detail') |
|
131 - self.assertEqual('256 mb server', f.name) |
|
132 + self.assertEqual('256 MB Server', f.name) |
|
133 |
|
134 f = self.cs.flavors.find(disk=0) |
|
135 - self.assertEqual('128 mb server', f.name) |
|
136 + self.assertEqual('128 MB Server', f.name) |
|
137 |
|
138 self.assertRaises(exceptions.NotFound, self.cs.flavors.find, |
|
139 disk=12345) |
|
140 diff --git a/novaclient/tests/unit/v2/test_shell.py b/novaclient/tests/unit/v2/test_shell.py |
|
141 index b1b9b80..3e7462c 100644 |
|
142 --- a/novaclient/tests/unit/v2/test_shell.py |
|
143 +++ b/novaclient/tests/unit/v2/test_shell.py |
|
144 @@ -668,10 +668,10 @@ class ShellTest(utils.TestCase): |
|
145 |
|
146 def test_boot_named_flavor(self): |
|
147 self.run_command(["boot", "--image", "1", |
|
148 - "--flavor", "512 mb server", |
|
149 + "--flavor", "512 MB Server", |
|
150 "--max-count", "3", "server"]) |
|
151 self.assert_called('GET', '/images/1', pos=0) |
|
152 - self.assert_called('GET', '/flavors/512 mb server', pos=1) |
|
153 + self.assert_called('GET', '/flavors/512 MB Server', pos=1) |
|
154 self.assert_called('GET', '/flavors?is_public=None', pos=2) |
|
155 self.assert_called('GET', '/flavors/2', pos=3) |
|
156 self.assert_called( |
|
157 @@ -708,15 +708,15 @@ class ShellTest(utils.TestCase): |
|
158 self.assert_called_anytime('GET', '/flavors/aa1') |
|
159 |
|
160 def test_flavor_show_by_name(self): |
|
161 - self.run_command(['flavor-show', '128 mb server']) |
|
162 - self.assert_called('GET', '/flavors/128 mb server', pos=0) |
|
163 + self.run_command(['flavor-show', '128 MB Server']) |
|
164 + self.assert_called('GET', '/flavors/128 MB Server', pos=0) |
|
165 self.assert_called('GET', '/flavors?is_public=None', pos=1) |
|
166 self.assert_called('GET', '/flavors/aa1', pos=2) |
|
167 self.assert_called('GET', '/flavors/aa1/os-extra_specs', pos=3) |
|
168 |
|
169 def test_flavor_show_by_name_priv(self): |
|
170 - self.run_command(['flavor-show', '512 mb server']) |
|
171 - self.assert_called('GET', '/flavors/512 mb server', pos=0) |
|
172 + self.run_command(['flavor-show', '512 MB Server']) |
|
173 + self.assert_called('GET', '/flavors/512 MB Server', pos=0) |
|
174 self.assert_called('GET', '/flavors?is_public=None', pos=1) |
|
175 self.assert_called('GET', '/flavors/2', pos=2) |
|
176 self.assert_called('GET', '/flavors/2/os-extra_specs', pos=3) |
|
177 @@ -753,7 +753,7 @@ class ShellTest(utils.TestCase): |
|
178 {'addTenantAccess': {'tenant': 'proj2'}}) |
|
179 |
|
180 def test_flavor_access_add_by_name(self): |
|
181 - self.run_command(['flavor-access-add', '512 mb server', 'proj2']) |
|
182 + self.run_command(['flavor-access-add', '512 MB Server', 'proj2']) |
|
183 self.assert_called('POST', '/flavors/2/action', |
|
184 {'addTenantAccess': {'tenant': 'proj2'}}) |
|
185 |
|
186 @@ -763,7 +763,7 @@ class ShellTest(utils.TestCase): |
|
187 {'removeTenantAccess': {'tenant': 'proj2'}}) |
|
188 |
|
189 def test_flavor_access_remove_by_name(self): |
|
190 - self.run_command(['flavor-access-remove', '512 mb server', 'proj2']) |
|
191 + self.run_command(['flavor-access-remove', '512 MB Server', 'proj2']) |
|
192 self.assert_called('POST', '/flavors/2/action', |
|
193 {'removeTenantAccess': {'tenant': 'proj2'}}) |
|
194 |
|
195 diff --git a/novaclient/v2/shell.py b/novaclient/v2/shell.py |
|
196 index 33653a1..f8b1a10 100644 |
|
197 --- a/novaclient/v2/shell.py |
|
198 +++ b/novaclient/v2/shell.py |
|
199 @@ -1898,17 +1898,6 @@ def _find_image(cs, image): |
|
200 def _find_flavor(cs, flavor): |
|
201 """Get a flavor by name, ID, or RAM size.""" |
|
202 try: |
|
203 - # isinstance() is being used to check if flavor is an instance of |
|
204 - # integer. It will help us to check if the user has entered flavor |
|
205 - # name or flavorid. If flavor name has been entered it is being |
|
206 - # converted to lowercase using lower(). Incase it is an ID the user |
|
207 - # has passed it will not go through the "flavor = flavor.lower()" |
|
208 - # code.The reason for checking if it is a flavor name or flavorid is |
|
209 - # that int has no lower() so it will give an error. |
|
210 - if isinstance(flavor, six.integer_types): |
|
211 - pass |
|
212 - else: |
|
213 - flavor = flavor.lower() |
|
214 return utils.find_resource(cs.flavors, flavor, is_public=None) |
|
215 except exceptions.NotFound: |
|
216 return cs.flavors.find(ram=flavor) |
|