diff --git a/pdc_client/plugins/auth_group_resource_permissions.py b/pdc_client/plugins/auth_group_resource_permissions.py new file mode 100644 index 0000000..88fb45b --- /dev/null +++ b/pdc_client/plugins/auth_group_resource_permissions.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2015 Red Hat +# Licensed under The MIT License (MIT) +# http://opensource.org/licenses/MIT +# + +from __future__ import print_function + +import json + +from pdc_client.plugin_helpers import (PDCClientPlugin, + extract_arguments, + add_parser_arguments, + add_create_update_args) + + +class AuthGroupResourcePermissionPlugin(PDCClientPlugin): + def register(self): + self.set_command('auth/group-resource-permissions') + list_parser = self.add_action('list', help='list all groups and their resource permission') + add_parser_arguments(list_parser, {'resource': {}, + 'permission': {}, + 'group': {}}, + group='Filtering') + list_parser.set_defaults(func=self.list_group_resource_permission) + + info_parser = self.add_action('info', help='display details about a group resource permission') + info_parser.add_argument('id', metavar='ID') + info_parser.set_defaults(func=self.group_resource_permission_info) + + update_parser = self.add_action('update', help='update an existing group resource permission') + update_parser.add_argument('id', metavar='ID') + self.add_create_update_argument(update_parser, required=True) + update_parser.set_defaults(func=self.group_resource_permission_update) + + create_parser = self.add_action('create', help='create new group resource permission') + self.add_create_update_argument(create_parser, required=True) + create_parser.set_defaults(func=self.group_resource_permission_create) + + delete_parser = self.add_action('delete', help='delete an existing group resource permission') + delete_parser.add_argument('id', metavar='ID') + delete_parser.set_defaults(func=self.group_resource_permission_delete) + + def add_create_update_argument(self, parser, required=True): + required_args = {'resource': {}, 'permission': {}, 'group': {}} + add_create_update_args(parser, required_args, {}, required) + + def print_group_resource_permissions(self, args): + fmt = '{0:<5} {1:20} {2:90} {3}' + start_line = True + for obj in args: + if start_line: + start_line = False + print(fmt.format('ID', 'Group', 'Resource', 'Permission')) + print() + print(fmt.format(obj['id'], obj['group'], obj['resource'], obj['permission'])) + + def list_group_resource_permission(self, args): + filters = extract_arguments(args) + results = self.client.get_paged(self.client['auth/group-resource-permissions']._, **filters) + if args.json: + print(json.dumps(list(results))) + return + if results: + self.print_group_resource_permissions(results) + + def group_resource_permission_info(self, args, id=None): + obj_id = id or args.id + results = self.client['auth/group-resource-permissions'][obj_id]._() + if args.json: + print(json.dumps(results)) + return + fmt = '{0:20} {1}' + print(fmt.format('ID', results['id'])) + print(fmt.format('Resource', results['resource'])) + print(fmt.format('Permission', results['permission'])) + print(fmt.format('Group', results['group'])) + + def group_resource_permission_update(self, args): + data = extract_arguments(args) + if data: + self.logger.debug('Updating group resource permission %s with data %r', args.id, data) + self.client['auth/group-resource-permissions'][args.id]._ += data + else: + self.logger.debug('Empty data, skipping request') + self.group_resource_permission_info(args) + + def group_resource_permission_create(self, args): + data = extract_arguments(args) + self.logger.debug('Creating group resource permission with data %r', data) + response = self.client['auth/group-resource-permissions']._(data) + self.group_resource_permission_info(args, response['id']) + + def group_resource_permission_delete(self, args): + data = extract_arguments(args) + self.logger.debug('Deleting : group resource permission %s', args.id) + self.client['auth/group-resource-permissions'][args.id]._("DELETE", data) + + +PLUGIN_CLASSES = [AuthGroupResourcePermissionPlugin] diff --git a/pdc_client/runner.py b/pdc_client/runner.py index bb19697..f2945a0 100644 --- a/pdc_client/runner.py +++ b/pdc_client/runner.py @@ -42,6 +42,7 @@ def autocomplete(*args): PLUGIN_DIRS = [LOCAL_DIR] if not os.path.exists(INSTALLED_DIR) else [INSTALLED_DIR] DEFAULT_PLUGINS = [ + 'auth_group_resource_permissions.py', 'build_image_rtt_tests.py', 'build_images.py', 'component.py', diff --git a/tests/auth_group_resource_permissions/__init__.py b/tests/auth_group_resource_permissions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/auth_group_resource_permissions/data/detail.json b/tests/auth_group_resource_permissions/data/detail.json new file mode 100644 index 0000000..8085b6d --- /dev/null +++ b/tests/auth_group_resource_permissions/data/detail.json @@ -0,0 +1,6 @@ +{ + "group": "engops", + "resource": "arches", + "id": 1, + "permission": "create" +} \ No newline at end of file diff --git a/tests/auth_group_resource_permissions/data/detail.txt b/tests/auth_group_resource_permissions/data/detail.txt new file mode 100644 index 0000000..45edf94 --- /dev/null +++ b/tests/auth_group_resource_permissions/data/detail.txt @@ -0,0 +1,4 @@ +ID 1 +Resource arches +Permission create +Group engops diff --git a/tests/auth_group_resource_permissions/data/list.json b/tests/auth_group_resource_permissions/data/list.json new file mode 100644 index 0000000..2e4f238 --- /dev/null +++ b/tests/auth_group_resource_permissions/data/list.json @@ -0,0 +1,176 @@ +[ + { + "id": 1, + "group": "group1", + "resource": "arches", + "permission": "create" + }, + { + "id": 2, + "group": "group2", + "resource": "arches", + "permission": "create" + }, + { + "id": 3, + "group": "group3", + "resource": "arches", + "permission": "create" + }, + { + "id": 4, + "group": "group4", + "resource": "arches", + "permission": "create" + }, + { + "id": 5, + "group": "group5", + "resource": "arches", + "permission": "create" + }, + { + "id": 6, + "group": "group6", + "resource": "arches", + "permission": "create" + }, + { + "id": 7, + "group": "group7", + "resource": "arches", + "permission": "create" + }, + { + "id": 8, + "group": "group8", + "resource": "arches", + "permission": "create" + }, + { + "id": 9, + "group": "group9", + "resource": "arches", + "permission": "create" + }, + { + "id": 10, + "group": "group10", + "resource": "arches", + "permission": "create" + }, + { + "id": 11, + "group": "group11", + "resource": "arches", + "permission": "create" + }, + { + "id": 12, + "group": "group12", + "resource": "arches", + "permission": "create" + }, + { + "id": 13, + "group": "group13", + "resource": "arches", + "permission": "create" + }, + { + "id": 14, + "group": "group14", + "resource": "arches", + "permission": "create" + }, + { + "id": 15, + "group": "group15", + "resource": "arches", + "permission": "create" + }, + { + "id": 16, + "group": "group16", + "resource": "arches", + "permission": "create" + }, + { + "id": 17, + "group": "group17", + "resource": "arches", + "permission": "create" + }, + { + "id": 18, + "group": "group18", + "resource": "arches", + "permission": "create" + }, + { + "id": 19, + "group": "group19", + "resource": "arches", + "permission": "create" + }, + { + "id": 20, + "group": "group20", + "resource": "arches", + "permission": "create" + }, + { + "id": 21, + "group": "group21", + "resource": "arches", + "permission": "create" + }, + { + "id": 22, + "group": "group22", + "resource": "arches", + "permission": "create" + }, + { + "id": 23, + "group": "group23", + "resource": "arches", + "permission": "create" + }, + { + "id": 24, + "group": "group24", + "resource": "arches", + "permission": "create" + }, + { + "id": 25, + "group": "group25", + "resource": "arches", + "permission": "create" + }, + { + "id": 26, + "group": "group26", + "resource": "arches", + "permission": "create" + }, + { + "id": 27, + "group": "group27", + "resource": "arches", + "permission": "create" + }, + { + "id": 28, + "group": "group28", + "resource": "arches", + "permission": "create" + }, + { + "id": 29, + "group": "group29", + "resource": "arches", + "permission": "create" + } +] diff --git a/tests/auth_group_resource_permissions/data/list.txt b/tests/auth_group_resource_permissions/data/list.txt new file mode 100644 index 0000000..589720a --- /dev/null +++ b/tests/auth_group_resource_permissions/data/list.txt @@ -0,0 +1,31 @@ +ID Group Resource Permission + +1 group1 arches create +2 group2 arches create +3 group3 arches create +4 group4 arches create +5 group5 arches create +6 group6 arches create +7 group7 arches create +8 group8 arches create +9 group9 arches create +10 group10 arches create +11 group11 arches create +12 group12 arches create +13 group13 arches create +14 group14 arches create +15 group15 arches create +16 group16 arches create +17 group17 arches create +18 group18 arches create +19 group19 arches create +20 group20 arches create +21 group21 arches create +22 group22 arches create +23 group23 arches create +24 group24 arches create +25 group25 arches create +26 group26 arches create +27 group27 arches create +28 group28 arches create +29 group29 arches create diff --git a/tests/auth_group_resource_permissions/tests.py b/tests/auth_group_resource_permissions/tests.py new file mode 100644 index 0000000..59df44d --- /dev/null +++ b/tests/auth_group_resource_permissions/tests.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2015 Red Hat +# Licensed under The MIT License (MIT) +# http://opensource.org/licenses/MIT +# +from pdc_client.test_helpers import CLITestCase +from pdc_client.runner import Runner + + +class AuthGroupResourcePermissionTestCase(CLITestCase): + def setUp(self): + self.runner = Runner() + self.runner.setup() + + def _setup_list(self, api): + api.add_endpoint('auth/group-resource-permissions', 'GET', [ + { + "id": x, + "group": "group" + str(x), + "resource": "arches", + "permission": "create" + } + + for x in range(1, 30) + ]) + + def test_list(self, api): + self._setup_list(api) + with self.expect_output('list.txt'): + self.runner.run(['auth/group-resource-permissions', 'list', '--resource', 'arches']) + self.assertEqual(api.calls['auth/group-resource-permissions'], + [('GET', {'page': 1, 'resource': 'arches'}), + ('GET', {'page': 2, 'resource': 'arches'})]) + + def test_list_json(self, api): + self._setup_list(api) + with self.expect_output('list.json', parse_json=True): + self.runner.run(['--json', 'auth/group-resource-permissions', 'list', '--resource', 'arches']) + self.assertEqual(api.calls['auth/group-resource-permissions'], + [('GET', {'page': 1, 'resource': 'arches'}), + ('GET', {'page': 2, 'resource': 'arches'})]) + + def _setup_detail(self, api): + obj = { + "id": 1, + "group": "engops", + "resource": "arches", + "permission": "create" + } + api.add_endpoint('auth/group-resource-permissions/1', 'GET', obj) + api.add_endpoint('auth/group-resource-permissions/1', 'PATCH', obj) + api.add_endpoint('auth/group-resource-permissions', 'POST', obj) + api.add_endpoint('auth/group-resource-permissions/1', 'DELETE', {}) + + def test_info(self, api): + self._setup_detail(api) + with self.expect_output('detail.txt'): + self.runner.run(['auth/group-resource-permissions', 'info', '1']) + self.assertEqual(api.calls['auth/group-resource-permissions/1'], [('GET', {})]) + + def test_info_json(self, api): + self._setup_detail(api) + with self.expect_output('detail.json', parse_json=True): + self.runner.run(['--json', 'auth/group-resource-permissions', 'info', '1']) + self.assertEqual(api.calls['auth/group-resource-permissions/1'], [('GET', {})]) + + def test_create(self, api): + self._setup_detail(api) + with self.expect_output('detail.txt'): + self.runner.run(['auth/group-resource-permissions', 'create', + '--group', 'engops', + '--resource', 'arches', + '--permission', 'create' + ]) + expected_data = { + "group": "engops", + "resource": "arches", + "permission": "create" + } + self.assertEqual(api.calls['auth/group-resource-permissions'], + [('POST', expected_data)]) + self.assertEqual(api.calls['auth/group-resource-permissions/1'], + [('GET', {})]) + + def test_update(self, api): + self._setup_detail(api) + with self.expect_output('detail.txt'): + self.runner.run(['auth/group-resource-permissions', 'update', '1', + '--group', 'engops', + '--resource', 'arches', + '--permission', 'create']) + self.assertEqual(api.calls['auth/group-resource-permissions/1'], + [('PATCH', {'resource': 'arches', + 'permission': 'create', + 'group': 'engops'}), + ('GET', {})]) + + def test_delete(self, api): + self._setup_detail(api) + self.runner.run(['auth/group-resource-permissions', 'delete', '1']) + self.assertEqual(api.calls['auth/group-resource-permissions/1'], [('DELETE', {})])