summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--glanceclient/shell.py2
-rw-r--r--glanceclient/tests/unit/test_shell.py8
-rw-r--r--glanceclient/tests/unit/v2/releasenotes/notes/add-member-get-command-11c15e0a94ecd39a.yaml5
-rw-r--r--glanceclient/tests/unit/v2/test_members.py16
-rw-r--r--glanceclient/tests/unit/v2/test_shell_v2.py10
-rw-r--r--glanceclient/v2/image_members.py6
-rw-r--r--glanceclient/v2/shell.py10
-rw-r--r--releasenotes/notes/fix-undesirable-raw-python-error-66e3ddaca7b72ae2.yaml7
-rw-r--r--requirements.txt2
-rwxr-xr-xrun_tests.sh2
10 files changed, 65 insertions, 3 deletions
diff --git a/glanceclient/shell.py b/glanceclient/shell.py
index ca10359..3a32bfb 100644
--- a/glanceclient/shell.py
+++ b/glanceclient/shell.py
@@ -166,6 +166,8 @@ class OpenStackImagesShell(object):
parser.add_argument('--os_image_api_version',
help=argparse.SUPPRESS)
+ parser.set_defaults(func=self.do_help)
+
if osprofiler_profiler:
parser.add_argument('--profile',
metavar='HMAC_KEY',
diff --git a/glanceclient/tests/unit/test_shell.py b/glanceclient/tests/unit/test_shell.py
index 74d1c33..129b127 100644
--- a/glanceclient/tests/unit/test_shell.py
+++ b/glanceclient/tests/unit/test_shell.py
@@ -211,6 +211,14 @@ class ShellTest(testutils.TestCase):
self.assertEqual(0, actual)
self.assertFalse(et_mock.called)
+ def test_help_no_subcommand(self):
+ shell = openstack_shell.OpenStackImagesShell()
+ argstr = '--os-image-api-version 2'
+ with mock.patch.object(shell, '_get_keystone_auth_plugin') as et_mock:
+ actual = shell.main(argstr.split())
+ self.assertEqual(0, actual)
+ self.assertFalse(et_mock.called)
+
def test_blank_call(self):
shell = openstack_shell.OpenStackImagesShell()
with mock.patch.object(shell, '_get_keystone_auth_plugin') as et_mock:
diff --git a/glanceclient/tests/unit/v2/releasenotes/notes/add-member-get-command-11c15e0a94ecd39a.yaml b/glanceclient/tests/unit/v2/releasenotes/notes/add-member-get-command-11c15e0a94ecd39a.yaml
new file mode 100644
index 0000000..d5fce03
--- /dev/null
+++ b/glanceclient/tests/unit/v2/releasenotes/notes/add-member-get-command-11c15e0a94ecd39a.yaml
@@ -0,0 +1,5 @@
+---
+fixes:
+ - |
+ Bug 1938154_: Added member-get command
+ .. _1938154: https://bugs.launchpad.net/glance/+bug/1938154
diff --git a/glanceclient/tests/unit/v2/test_members.py b/glanceclient/tests/unit/v2/test_members.py
index 7048a97..240f2b2 100644
--- a/glanceclient/tests/unit/v2/test_members.py
+++ b/glanceclient/tests/unit/v2/test_members.py
@@ -45,6 +45,17 @@ data_fixtures = {
)
},
'/v2/images/{image}/members/{mem}'.format(image=IMAGE, mem=MEMBER): {
+ 'GET': (
+ {},
+ {
+ 'image_id': IMAGE,
+ 'member_id': MEMBER,
+ 'status': 'pending',
+ 'created_at': '2013-11-26T07:21:21Z',
+ 'updated_at': '2013-11-26T07:21:21Z',
+ 'schema': "/v2/schemas/member"
+ },
+ ),
'DELETE': (
{},
None,
@@ -90,6 +101,11 @@ class TestController(testtools.TestCase):
self.assertEqual(IMAGE, image_members[0].image_id)
self.assertEqual(MEMBER, image_members[0].member_id)
+ def test_get_image_members(self):
+ image_member = self.controller.get(IMAGE, MEMBER)
+ self.assertEqual(IMAGE, image_member.image_id)
+ self.assertEqual(MEMBER, image_member.member_id)
+
def test_delete_image_member(self):
image_id = IMAGE
member_id = MEMBER
diff --git a/glanceclient/tests/unit/v2/test_shell_v2.py b/glanceclient/tests/unit/v2/test_shell_v2.py
index c2aa58a..83c4727 100644
--- a/glanceclient/tests/unit/v2/test_shell_v2.py
+++ b/glanceclient/tests/unit/v2/test_shell_v2.py
@@ -2378,6 +2378,16 @@ class ShellV2Test(testtools.TestCase):
columns = ['Image ID', 'Member ID', 'Status']
utils.print_list.assert_called_once_with({}, columns)
+ def test_do_member_get(self):
+ args = self._make_args({'image_id': 'IMG-01', 'member_id': 'MEM-01'})
+ with mock.patch.object(self.gc.image_members, 'get') as mock_get:
+ mock_get.return_value = {}
+
+ test_shell.do_member_get(self.gc, args)
+
+ mock_get.assert_called_once_with('IMG-01', 'MEM-01')
+ utils.print_dict.assert_called_once_with({})
+
def test_do_member_create(self):
args = self._make_args({'image_id': 'IMG-01', 'member_id': 'MEM-01'})
with mock.patch.object(self.gc.image_members, 'create') as mock_create:
diff --git a/glanceclient/v2/image_members.py b/glanceclient/v2/image_members.py
index 780519a..096429a 100644
--- a/glanceclient/v2/image_members.py
+++ b/glanceclient/v2/image_members.py
@@ -40,6 +40,12 @@ class Controller(object):
yield self.model(member), resp
@utils.add_req_id_to_object()
+ def get(self, image_id, member_id):
+ url = '/v2/images/%s/members/%s' % (image_id, member_id)
+ resp, member = self.http_client.get(url)
+ return self.model(member), resp
+
+ @utils.add_req_id_to_object()
def delete(self, image_id, member_id):
resp, body = self.http_client.delete('/v2/images/%s/members/%s' %
(image_id, member_id))
diff --git a/glanceclient/v2/shell.py b/glanceclient/v2/shell.py
index c38d046..5f83bd2 100644
--- a/glanceclient/v2/shell.py
+++ b/glanceclient/v2/shell.py
@@ -490,13 +490,21 @@ def do_image_tasks(gc, args):
help=_('Image to display members of.'))
def do_member_list(gc, args):
"""Describe sharing permissions by image."""
-
members = gc.image_members.list(args.image_id)
columns = ['Image ID', 'Member ID', 'Status']
utils.print_list(members, columns)
@utils.arg('image_id', metavar='<IMAGE_ID>',
+ help=_('Image from which to display member.'))
+@utils.arg('member_id', metavar='<MEMBER_ID>',
+ help=_('Project to display.'))
+def do_member_get(gc, args):
+ """Show details of an image member"""
+ member = gc.image_members.get(args.image_id, args.member_id)
+ utils.print_dict(member)
+
+@utils.arg('image_id', metavar='<IMAGE_ID>',
help=_('Image from which to remove member.'))
@utils.arg('member_id', metavar='<MEMBER_ID>',
help=_('Tenant to remove as member.'))
diff --git a/releasenotes/notes/fix-undesirable-raw-python-error-66e3ddaca7b72ae2.yaml b/releasenotes/notes/fix-undesirable-raw-python-error-66e3ddaca7b72ae2.yaml
new file mode 100644
index 0000000..d6fad7d
--- /dev/null
+++ b/releasenotes/notes/fix-undesirable-raw-python-error-66e3ddaca7b72ae2.yaml
@@ -0,0 +1,7 @@
+---
+fixes:
+ - |
+ `Bug #1903727 <https://bugs.launchpad.net/python-glanceclient/+bug/1903727>`_:
+ Fixed raw Python error message when using ``glance`` without
+ a subcommand while passing an optional argument, such as
+ ``--os-image-api-version``.
diff --git a/requirements.txt b/requirements.txt
index ca8abaf..e2a92e4 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,7 +2,7 @@
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
pbr!=2.1.0,>=2.0.0 # Apache-2.0
-PrettyTable<0.8,>=0.7.1 # BSD
+PrettyTable>=0.7.1 # BSD
keystoneauth1>=3.6.2 # Apache-2.0
requests>=2.14.2 # Apache-2.0
warlock<2,>=1.2.0 # Apache-2.0
diff --git a/run_tests.sh b/run_tests.sh
index 1b6551a..7238da5 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -18,7 +18,7 @@ command -v tox > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo 'This script requires "tox" to run.'
echo 'You can install it with "pip install tox".'
- exit 1;
+ exit 1;
fi
just_pep8=0