Add support for usage API

This is really a very simple activity of fetching and showing the
results of the usage API in table form for the user.

Depends-On: https://review.opendev.org/c/openstack/glance/+/794860
Change-Id: I3d9360785a759e4a6e7905710400baea80776052
This commit is contained in:
Dan Smith
2022-01-31 12:57:18 -08:00
parent b4c3be8aac
commit 3f001f5f11
5 changed files with 82 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
# Copyright 2022 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import testtools
from unittest import mock
from glanceclient.v2 import info
class TestController(testtools.TestCase):
def setUp(self):
super(TestController, self).setUp()
self.fake_client = mock.MagicMock()
self.info_controller = info.Controller(self.fake_client, None)
def test_get_usage(self):
fake_usage = {
'usage': {
'quota1': {'limit': 10, 'usage': 0},
'quota2': {'limit': 20, 'usage': 5},
}
}
self.fake_client.get.return_value = (mock.MagicMock(), fake_usage)
usage = self.info_controller.get_usage()
self.assertEqual(fake_usage['usage'], usage)
self.fake_client.get.assert_called_once_with('/v2/info/usage')
@@ -614,6 +614,16 @@ class ShellV2Test(testtools.TestCase):
mock_exit.assert_called_once_with( mock_exit.assert_called_once_with(
'Server does not support image tasks API (v2.12)') 'Server does not support image tasks API (v2.12)')
def test_usage(self):
with mock.patch.object(self.gc.info, 'get_usage') as mock_usage:
mock_usage.return_value = {'quota1': {'limit': 10, 'usage': 0},
'quota2': {'limit': 20, 'usage': 5}}
test_shell.do_usage(self.gc, [])
utils.print_dict_list.assert_called_once_with(
[{'quota': 'quota1', 'limit': 10, 'usage': 0},
{'quota': 'quota2', 'limit': 20, 'usage': 5}],
['Quota', 'Limit', 'Usage'])
@mock.patch('sys.stdin', autospec=True) @mock.patch('sys.stdin', autospec=True)
def test_do_image_create_no_user_props(self, mock_stdin): def test_do_image_create_no_user_props(self, mock_stdin):
args = self._make_args({'name': 'IMG-01', 'disk_format': 'vhd', args = self._make_args({'name': 'IMG-01', 'disk_format': 'vhd',
+3
View File
@@ -19,6 +19,7 @@ from glanceclient.common import utils
from glanceclient.v2 import image_members from glanceclient.v2 import image_members
from glanceclient.v2 import image_tags from glanceclient.v2 import image_tags
from glanceclient.v2 import images from glanceclient.v2 import images
from glanceclient.v2 import info
from glanceclient.v2 import metadefs from glanceclient.v2 import metadefs
from glanceclient.v2 import schemas from glanceclient.v2 import schemas
from glanceclient.v2 import tasks from glanceclient.v2 import tasks
@@ -48,6 +49,8 @@ class Client(object):
self.image_members = image_members.Controller(self.http_client, self.image_members = image_members.Controller(self.http_client,
self.schemas) self.schemas)
self.info = info.Controller(self.http_client, self.schemas)
self.tasks = tasks.Controller(self.http_client, self.schemas) self.tasks = tasks.Controller(self.http_client, self.schemas)
self.metadefs_resource_type = ( self.metadefs_resource_type = (
+23
View File
@@ -0,0 +1,23 @@
# Copyright 2022 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
class Controller:
def __init__(self, http_client, schema_client):
self.http_client = http_client
self.schema_client = schema_client
def get_usage(self, **kwargs):
resp, body = self.http_client.get('/v2/info/usage')
return body['usage']
+9
View File
@@ -486,6 +486,15 @@ def do_image_tasks(gc, args):
utils.exit('Server does not support image tasks API (v2.12)') utils.exit('Server does not support image tasks API (v2.12)')
def do_usage(gc, args):
"""Get quota usage information."""
columns = ['Quota', 'Limit', 'Usage']
usage = gc.info.get_usage()
utils.print_dict_list(
[dict(v, quota=k) for k, v in usage.items()],
columns)
@utils.arg('--image-id', metavar='<IMAGE_ID>', required=True, @utils.arg('--image-id', metavar='<IMAGE_ID>', required=True,
help=_('Image to display members of.')) help=_('Image to display members of.'))
def do_member_list(gc, args): def do_member_list(gc, args):