From 611b286cea0c759b1c081bc3204dfa39503804db Mon Sep 17 00:00:00 2001 From: David J Peacock Date: Wed, 3 Apr 2019 09:40:11 -0400 Subject: [PATCH] Implement tripleo container image list command This patch implements the tripleo container image list command, reading for a remote registry URL, e.g. localhost:8787. Returns a single column ascii table with full names of each image discovered. Change-Id: I44d19692fb7ab16797460215a98baf75e6b82034 --- ...container-image-list-97d38a0e8a899d89.yaml | 8 +++ setup.cfg | 1 + .../tests/v1/test_container_image.py | 65 +++++++++++++++++++ tripleoclient/v1/container_image.py | 45 +++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 releasenotes/notes/tripleo-container-image-list-97d38a0e8a899d89.yaml diff --git a/releasenotes/notes/tripleo-container-image-list-97d38a0e8a899d89.yaml b/releasenotes/notes/tripleo-container-image-list-97d38a0e8a899d89.yaml new file mode 100644 index 000000000..fb51dca21 --- /dev/null +++ b/releasenotes/notes/tripleo-container-image-list-97d38a0e8a899d89.yaml @@ -0,0 +1,8 @@ +--- +features: + - | + With the new podman container setup comes an Apache served local image + registry. + + `openstack tripleo container image list` gives you insight into your + images. diff --git a/setup.cfg b/setup.cfg index c3499de9a..f760cc2cb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -103,6 +103,7 @@ openstack.tripleoclient.v1 = overcloud_ffwd-upgrade_converge = tripleoclient.v1.overcloud_ffwd_upgrade:FFWDUpgradeConverge overcloud_execute = tripleoclient.v1.overcloud_execute:RemoteExecute overcloud_generate_fencing = tripleoclient.v1.overcloud_parameters:GenerateFencingParameters + tripleo_container_image_list = tripleoclient.v1.container_image:TripleOContainerImageList tripleo_container_image_prepare = tripleoclient.v1.container_image:TripleOImagePrepare tripleo_container_image_prepare_default = tripleoclient.v1.container_image:TripleOImagePrepareDefault undercloud_deploy = tripleoclient.v1.undercloud_deploy:DeployUndercloud diff --git a/tripleoclient/tests/v1/test_container_image.py b/tripleoclient/tests/v1/test_container_image.py index 64e052c9d..36873e3b4 100644 --- a/tripleoclient/tests/v1/test_container_image.py +++ b/tripleoclient/tests/v1/test_container_image.py @@ -80,6 +80,71 @@ class TestContainerImageUpload(TestPluginV1): mock_manager.return_value.upload.assert_called_once_with() +class TestContainerImageList(TestPluginV1): + + def setUp(self): + super(TestContainerImageList, self).setUp() + self.cmd = container_image.TripleOContainerImageList(self.app, None) + + @mock.patch('tripleo_common.image.image_uploader.ImageUploadManager') + def test_take_action(self, mock_manager): + arglist = [] + verifylist = [] + + mock_manager.return_value.uploader.return_value.list.return_value = \ + ['a', 'b'] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + rv = self.cmd.take_action(parsed_args) + actual = (('Image Name',), [('a',), ('b',)]) + self.assertEqual(actual, rv) + + @mock.patch('tripleo_common.image.image_uploader.ImageUploadManager') + def test_take_action_auth(self, mock_manager): + # check arg parsing items + arglist = ['--registry-url', 'reg-url', + '--username', 'foo', + '--password', 'bar'] + verifylist = [('registry_url', 'reg-url'), + ('username', 'foo'), + ('password', 'bar')] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # mock manager object + mock_mgr = mock.Mock() + mock_manager.return_value = mock_mgr + + # mock uploader object + mock_uploader = mock.Mock() + mock_mgr.uploader.return_value = mock_uploader + + # mock return url object from uploader._image_to_url + mock_url = mock.Mock() + mock_url.geturl.return_value = 'munged-reg-url' + + mock_uploader._image_to_url.return_value = mock_url + + # mock return session object from uploader.authenticate + mock_session = mock.Mock() + mock_uploader.authenticate.return_value = mock_session + + # mock image list function + mock_uploader.list.return_value = ['a', 'b'] + + rv = self.cmd.take_action(parsed_args) + + # check various functions are called with expected inputs + mock_mgr.uploader.assert_called_with('python') + mock_uploader._image_to_url.assert_called_with('reg-url') + mock_uploader.authenticate.assert_called_with(mock_url, 'foo', 'bar') + mock_uploader.list.assert_called_with('munged-reg-url', + session=mock_session) + + # check data format for lister + actual = (('Image Name',), [('a',), ('b',)]) + self.assertEqual(actual, rv) + + class TestContainerImagePrepare(TestPluginV1): def setUp(self): diff --git a/tripleoclient/v1/container_image.py b/tripleoclient/v1/container_image.py index 8aa710582..5811d212d 100644 --- a/tripleoclient/v1/container_image.py +++ b/tripleoclient/v1/container_image.py @@ -544,6 +544,51 @@ class DiscoverImageTag(command.Command): )) +class TripleOContainerImageList(command.Lister): + """List images discovered in registry.""" + + auth_required = False + log = logging.getLogger(__name__ + ".TripleoContainerImageList") + + def get_parser(self, prog_name): + parser = super(TripleOContainerImageList, self).get_parser(prog_name) + parser.add_argument( + "--registry-url", + dest="registry_url", + metavar='', + default=image_uploader.get_undercloud_registry(), + help=_("URL of registry images are to be listed from in the " + "form :.") + ) + parser.add_argument( + "--username", + dest="username", + metavar='', + help=_("Username for image registry.") + ) + parser.add_argument( + "--password", + dest="password", + metavar='', + help=_("Password for image registry.") + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)" % parsed_args) + + manager = image_uploader.ImageUploadManager() + uploader = manager.uploader('python') + url = uploader._image_to_url(parsed_args.registry_url) + session = uploader.authenticate(url, parsed_args.username, + parsed_args.password) + results = uploader.list(url.geturl(), session=session) + cliff_results = [] + for r in results: + cliff_results.append((r,)) + return (("Image Name",), cliff_results) + + class TripleOImagePrepareDefault(command.Command): """Generate a default ContainerImagePrepare parameter."""