diff options
-rw-r--r-- | glanceclient/shell.py | 2 | ||||
-rw-r--r-- | glanceclient/tests/unit/test_shell.py | 8 | ||||
-rw-r--r-- | glanceclient/tests/unit/v2/releasenotes/notes/add-member-get-command-11c15e0a94ecd39a.yaml | 5 | ||||
-rw-r--r-- | glanceclient/tests/unit/v2/test_members.py | 16 | ||||
-rw-r--r-- | glanceclient/tests/unit/v2/test_shell_v2.py | 10 | ||||
-rw-r--r-- | glanceclient/v2/image_members.py | 6 | ||||
-rw-r--r-- | glanceclient/v2/shell.py | 10 | ||||
-rw-r--r-- | releasenotes/notes/fix-undesirable-raw-python-error-66e3ddaca7b72ae2.yaml | 7 | ||||
-rw-r--r-- | requirements.txt | 2 | ||||
-rwxr-xr-x | run_tests.sh | 2 |
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 |