From d5353fe83325af10ada334550d817a2fc007d8dc Mon Sep 17 00:00:00 2001 From: Cheng Yu Date: Thu, 24 Sep 2015 20:21:05 +0800 Subject: [PATCH] Add build images plugin. JIRA: 1025 --- pdc_client/plugins/build_images.py | 84 +++++++++++++++++++ pdc_client/tests/build_image/__init__.py | 0 pdc_client/tests/build_image/data/detail.json | 9 ++ pdc_client/tests/build_image/data/detail.txt | 4 + .../build_image/data/list_multi_page.txt | 30 +++++++ pdc_client/tests/build_image/tests.py | 68 +++++++++++++++ 6 files changed, 195 insertions(+) create mode 100644 pdc_client/plugins/build_images.py create mode 100644 pdc_client/tests/build_image/__init__.py create mode 100644 pdc_client/tests/build_image/data/detail.json create mode 100644 pdc_client/tests/build_image/data/detail.txt create mode 100644 pdc_client/tests/build_image/data/list_multi_page.txt create mode 100644 pdc_client/tests/build_image/tests.py diff --git a/pdc_client/plugins/build_images.py b/pdc_client/plugins/build_images.py new file mode 100644 index 00000000..7097b26c --- /dev/null +++ b/pdc_client/plugins/build_images.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2015 Red Hat +# Licensed under The MIT License (MIT) +# http://opensource.org/licenses/MIT +# +import json +import sys + +from pdc_client import get_paged +from pdc_client.plugin_helpers import PDCClientPlugin, add_parser_arguments, extract_arguments + + +class BuildImagePlugin(PDCClientPlugin): + def register(self): + subcmd = self.add_command('build-image-list', help='list all build images') + subcmd.add_argument('--show-md5', action='store_true', + help='whether to display md5 checksums') + add_parser_arguments(subcmd, {'component_name': {}, + 'rpm_version': {}, + 'rpm_release': {}, + 'image_id': {}, + 'image_format': {}, + 'md5': {}, + 'archive_build_nvr': {}, + 'archive_name': {}, + 'archive_size': {}, + 'archive_md5': {}, + 'release_id': {}}, + group='Filtering') + + subcmd.set_defaults(func=self.list_build_image) + + subcmd = self.add_command('build-image-info', help='display details of a build image') + subcmd.add_argument('image_id', metavar='IMAGE_ID') + subcmd.set_defaults(func=self.build_image_info) + + def _print_build_image_list(self, build_images, with_md5=False): + fmt = '{image_id}' + if with_md5: + fmt += ' {md5}' + for build_image in build_images: + print fmt.format(**build_image) + + def list_build_image(self, args): + filters = extract_arguments(args) + build_images = get_paged(self.client['build-images']._, **filters) + if args.json: + print json.dumps(list(build_images)) + return + self._print_build_image_list(build_images, args.show_md5) + + def build_image_info(self, args, image_id=None): + image_id = image_id or args.image_id + build_images = self.client['build-images']._(image_id=image_id) + if not build_images['count']: + print 'Not found' + sys.exit(1) + build_image = build_images['results'][0] + if args.json: + print json.dumps(build_image) + return + fmt = '{:20} {}' + print fmt.format('Image ID', build_image['image_id']) + print fmt.format('Image Format', build_image['image_format']) + print fmt.format('URL', build_image['url']) + print fmt.format('MD5', build_image['md5']) + + for key in ('releases', 'rpms'): + if build_image[key]: + print '\nRelated %s:' % key + for value in build_image[key]: + print ' * {}'.format(value) + + if build_image['archives']: + print '\nRelated archives:' + fmt = '* {:40}{:60}{}' + print fmt.format('MD5', 'Name', 'Build NVR') + fmt = ' {:40}{:60}{}' + for archive in build_image['archives']: + print fmt.format(archive['md5'], archive['name'], archive['build_nvr']) + + +PLUGIN_CLASSES = [BuildImagePlugin] diff --git a/pdc_client/tests/build_image/__init__.py b/pdc_client/tests/build_image/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pdc_client/tests/build_image/data/detail.json b/pdc_client/tests/build_image/data/detail.json new file mode 100644 index 00000000..bf60a930 --- /dev/null +++ b/pdc_client/tests/build_image/data/detail.json @@ -0,0 +1,9 @@ +{ + "archives": [], + "image_format": "docker", + "image_id": "test_image_1", + "md5": "11112222333344445555666677778899", + "releases": [], + "rpms": [], + "url": "http://127.0.0.1:8000/rest_api/v1/build-images/1/" +} diff --git a/pdc_client/tests/build_image/data/detail.txt b/pdc_client/tests/build_image/data/detail.txt new file mode 100644 index 00000000..7bf9397b --- /dev/null +++ b/pdc_client/tests/build_image/data/detail.txt @@ -0,0 +1,4 @@ +Image ID test_image_1 +Image Format docker +URL http://127.0.0.1:8000/rest_api/v1/build-images/1/ +MD5 11112222333344445555666677778899 diff --git a/pdc_client/tests/build_image/data/list_multi_page.txt b/pdc_client/tests/build_image/data/list_multi_page.txt new file mode 100644 index 00000000..89372fa8 --- /dev/null +++ b/pdc_client/tests/build_image/data/list_multi_page.txt @@ -0,0 +1,30 @@ +build-image-0 +build-image-1 +build-image-2 +build-image-3 +build-image-4 +build-image-5 +build-image-6 +build-image-7 +build-image-8 +build-image-9 +build-image-10 +build-image-11 +build-image-12 +build-image-13 +build-image-14 +build-image-15 +build-image-16 +build-image-17 +build-image-18 +build-image-19 +build-image-20 +build-image-21 +build-image-22 +build-image-23 +build-image-24 +build-image-25 +build-image-26 +build-image-27 +build-image-28 +build-image-29 diff --git a/pdc_client/tests/build_image/tests.py b/pdc_client/tests/build_image/tests.py new file mode 100644 index 00000000..ded8441b --- /dev/null +++ b/pdc_client/tests/build_image/tests.py @@ -0,0 +1,68 @@ +# -*- 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 BuildImageTestCase(CLITestCase): + def setUp(self): + self.runner = Runner() + self.runner.setup() + + def _setup_list_1(self, api): + api.add_endpoint('build-images', 'GET', [ + {'image_id': 'build-image-{}'.format(x), + 'md5': '111122223333444455556666777788{:02}'.format(x)} + for x in range(30) + ]) + + def _setup_detail(self, api): + obj = {'image_id': 'test_image_1', + 'url': 'http://127.0.0.1:8000/rest_api/v1/build-images/1/', + 'image_format': 'docker', + 'md5': '11112222333344445555666677778899', + 'rpms': [], + 'archives': [], + 'releases': []} + api.add_endpoint('build-images/1', 'PATCH', obj) + api.add_endpoint('build-images/1', 'GET', obj) + api.add_endpoint('build-images', 'POST', obj) + + def _setup_list_2(self, api): + filter_result = { + "count": 1, + "next": None, + "previous": None, + "results": [ + { + "archives": [], + "image_format": "docker", + "image_id": "test_image_1", + "md5": "11112222333344445555666677778899", + "releases": [], + "rpms": [], + "url": "http://127.0.0.1:8000/rest_api/v1/build-images/1/" + } + ] + } + + api.add_endpoint('build-images', 'GET', filter_result) + + def test_list(self, api): + self._setup_list_1(api) + with self.expect_output('list_multi_page.txt'): + self.runner.run(['build-image-list']) + self.assertEqual(api.calls['build-images'], + [('GET', {'page': 1}), + ('GET', {'page': 2})]) + + def test_info(self, api): + self._setup_detail(api) + self._setup_list_2(api) + with self.expect_output('detail.json', parse_json=True): + self.runner.run(['--json', 'build-image-info', 'test_image_1']) + self.assertEqual(api.calls['build-images'], [('GET', {'image_id': 'test_image_1'})])