Skip to content

Commit 0ccd2a8

Browse files
committed
Add project name/ID validation for "openstack quota show"
A validation is necessary to check the existence of project. This patch is similar to Ia2d8c96527820e25b074e6486d3f39c5ad7eae60. Change-Id: Id8895ba7a21ecad05942619a82a87c0dc68eae53
1 parent 27869c0 commit 0ccd2a8

3 files changed

Lines changed: 132 additions & 3 deletions

File tree

openstackclient/common/quota.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,19 @@ def get_parser(self, prog_name):
173173
return parser
174174

175175
def get_compute_volume_quota(self, client, parsed_args):
176+
identity_client = self.app.client_manager.identity
177+
project = utils.find_resource(
178+
identity_client.projects,
179+
parsed_args.project,
180+
).id
181+
176182
try:
177183
if parsed_args.quota_class:
178-
quota = client.quota_classes.get(parsed_args.project)
184+
quota = client.quota_classes.get(project)
179185
elif parsed_args.default:
180-
quota = client.quotas.defaults(parsed_args.project)
186+
quota = client.quotas.defaults(project)
181187
else:
182-
quota = client.quotas.get(parsed_args.project)
188+
quota = client.quotas.get(project)
183189
except Exception as e:
184190
if type(e).__name__ == 'EndpointNotFound':
185191
return {}

openstackclient/tests/common/test_quota.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from openstackclient.tests.compute.v2 import fakes as compute_fakes
1919
from openstackclient.tests import fakes
2020
from openstackclient.tests.identity.v2_0 import fakes as identity_fakes
21+
from openstackclient.tests.network.v2 import fakes as network_fakes
2122

2223

2324
class FakeQuotaResource(fakes.FakeResource):
@@ -41,13 +42,23 @@ def setUp(self):
4142
super(TestQuota, self).setUp()
4243
self.quotas_mock = self.app.client_manager.compute.quotas
4344
self.quotas_mock.reset_mock()
45+
self.quotas_class_mock = self.app.client_manager.compute.quota_classes
46+
self.quotas_class_mock.reset_mock()
4447
volume_mock = mock.Mock()
4548
volume_mock.quotas = mock.Mock()
4649
self.app.client_manager.volume = volume_mock
4750
self.volume_quotas_mock = volume_mock.quotas
4851
self.volume_quotas_mock.reset_mock()
52+
self.volume_quotas_class_mock = \
53+
self.app.client_manager.volume.quota_classes
54+
self.volume_quotas_class_mock.reset_mock()
4955
self.projects_mock = self.app.client_manager.identity.projects
5056
self.projects_mock.reset_mock()
57+
self.app.client_manager.auth_ref = mock.Mock()
58+
self.app.client_manager.auth_ref.service_catalog = mock.Mock()
59+
self.service_catalog_mock = \
60+
self.app.client_manager.auth_ref.service_catalog
61+
self.service_catalog_mock.reset_mock()
5162

5263

5364
class TestQuotaSet(TestQuota):
@@ -172,3 +183,113 @@ def test_quota_set_volume(self):
172183
identity_fakes.project_id,
173184
**kwargs
174185
)
186+
187+
188+
class TestQuotaShow(TestQuota):
189+
190+
def setUp(self):
191+
super(TestQuotaShow, self).setUp()
192+
193+
self.quotas_mock.get.return_value = FakeQuotaResource(
194+
None,
195+
copy.deepcopy(compute_fakes.QUOTA),
196+
loaded=True,
197+
)
198+
199+
self.quotas_mock.defaults.return_value = FakeQuotaResource(
200+
None,
201+
copy.deepcopy(compute_fakes.QUOTA),
202+
loaded=True,
203+
)
204+
205+
self.volume_quotas_mock.get.return_value = FakeQuotaResource(
206+
None,
207+
copy.deepcopy(compute_fakes.QUOTA),
208+
loaded=True,
209+
)
210+
211+
self.volume_quotas_mock.defaults.return_value = FakeQuotaResource(
212+
None,
213+
copy.deepcopy(compute_fakes.QUOTA),
214+
loaded=True,
215+
)
216+
217+
self.service_catalog_mock.get_endpoints.return_value = [
218+
fakes.FakeResource(
219+
None,
220+
copy.deepcopy(identity_fakes.ENDPOINT),
221+
loaded=True,
222+
)
223+
]
224+
225+
self.quotas_class_mock.get.return_value = FakeQuotaResource(
226+
None,
227+
copy.deepcopy(compute_fakes.QUOTA),
228+
loaded=True,
229+
)
230+
231+
self.volume_quotas_class_mock.get.return_value = FakeQuotaResource(
232+
None,
233+
copy.deepcopy(compute_fakes.QUOTA),
234+
loaded=True,
235+
)
236+
237+
self.projects_mock.get.return_value = fakes.FakeResource(
238+
None,
239+
copy.deepcopy(identity_fakes.PROJECT),
240+
loaded=True,
241+
)
242+
243+
self.app.client_manager.network = network_fakes.FakeNetworkV2Client(
244+
endpoint=fakes.AUTH_URL,
245+
token=fakes.AUTH_TOKEN,
246+
)
247+
248+
self.cmd = quota.ShowQuota(self.app, None)
249+
250+
def test_quota_show(self):
251+
arglist = [
252+
identity_fakes.project_name,
253+
]
254+
verifylist = [
255+
('project', identity_fakes.project_name),
256+
]
257+
258+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
259+
260+
self.cmd.take_action(parsed_args)
261+
262+
self.quotas_mock.get.assert_called_with(identity_fakes.project_id)
263+
264+
def test_quota_show_with_default(self):
265+
arglist = [
266+
'--default',
267+
identity_fakes.project_name,
268+
]
269+
verifylist = [
270+
('default', True),
271+
('project', identity_fakes.project_name),
272+
]
273+
274+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
275+
276+
self.cmd.take_action(parsed_args)
277+
278+
self.quotas_mock.defaults.assert_called_with(identity_fakes.project_id)
279+
280+
def test_quota_show_with_class(self):
281+
arglist = [
282+
'--class',
283+
identity_fakes.project_name,
284+
]
285+
verifylist = [
286+
('quota_class', True),
287+
('project', identity_fakes.project_name),
288+
]
289+
290+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
291+
292+
self.cmd.take_action(parsed_args)
293+
294+
self.quotas_class_mock.get.assert_called_with(
295+
identity_fakes.project_id)

openstackclient/tests/compute/v2/fakes.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ def __init__(self, **kwargs):
9595
self.flavors.resource_class = fakes.FakeResource(None, {})
9696
self.quotas = mock.Mock()
9797
self.quotas.resource_class = fakes.FakeResource(None, {})
98+
self.quota_classes = mock.Mock()
99+
self.quota_classes.resource_class = fakes.FakeResource(None, {})
98100
self.volumes = mock.Mock()
99101
self.volumes.resource_class = fakes.FakeResource(None, {})
100102
self.auth_token = kwargs['token']

0 commit comments

Comments
 (0)