From f79904c3f20bcebe398ec02be31b712001f4c163 Mon Sep 17 00:00:00 2001 From: Mike Fedosin Date: Wed, 5 Apr 2017 23:55:44 +0300 Subject: [PATCH] Raise error if there are more than 1 artifact with same name/version Change-Id: Ifa69a12de15b854c6b27d2b3edd37d0eb47eabf8 --- glareclient/common/utils.py | 14 ++++++++++ glareclient/osc/v1/artifacts.py | 30 +++++++--------------- glareclient/osc/v1/blobs.py | 18 +++---------- glareclient/tests/unit/osc/v1/test_blob.py | 6 ++--- glareclient/v1/artifacts.py | 25 +++++++++++++++--- 5 files changed, 51 insertions(+), 42 deletions(-) diff --git a/glareclient/common/utils.py b/glareclient/common/utils.py index 46a11ea..7e2690d 100644 --- a/glareclient/common/utils.py +++ b/glareclient/common/utils.py @@ -29,6 +29,8 @@ from oslo_utils import encodeutils from oslo_utils import importutils import requests +from glareclient import exc + SENSITIVE_HEADERS = ('X-Auth-Token', ) @@ -159,3 +161,15 @@ def save_blob(data, path): finally: if path is not None: blob.close() + + +def get_artifact_id(client, parsed_args): + if parsed_args.id: + return parsed_args.name + try: + return client.artifacts.get_by_name( + parsed_args.name, + version=parsed_args.artifact_version, + type_name=parsed_args.type_name)['id'] + except exc.BadRequest as e: + exit(msg=e.details) diff --git a/glareclient/osc/v1/artifacts.py b/glareclient/osc/v1/artifacts.py index b85158b..9e811bc 100644 --- a/glareclient/osc/v1/artifacts.py +++ b/glareclient/osc/v1/artifacts.py @@ -42,18 +42,6 @@ def print_artifact(client, data, type_name): table) -def get_artifact_id(client, parsed_args): - if parsed_args.id: - if parsed_args.artifact_version != 'latest': - LOG.warning('Specified version is not considered when ' - 'receiving of the artifact by ID.') - return parsed_args.name - - return client.artifacts.get_by_name(parsed_args.name, - version=parsed_args.artifact_version, - type_name=parsed_args.type_name)['id'] - - class ListArtifacts(command.Lister): """List of artifacts""" @@ -151,7 +139,7 @@ class ShowArtifact(command.Lister): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = glare_utils.get_artifact_id(client, parsed_args) data = client.artifacts.get(af_id, type_name=parsed_args.type_name) @@ -311,7 +299,7 @@ class UpdateArtifact(command.Lister): prop[key][k] = v client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = glare_utils.get_artifact_id(client, parsed_args) data = client.artifacts.update( af_id, type_name=parsed_args.type_name, remove_props=parsed_args.remove_property, **prop) @@ -351,7 +339,7 @@ class DeleteArtifact(command.Command): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = glare_utils.get_artifact_id(client, parsed_args) client.artifacts.delete(af_id, type_name=parsed_args.type_name) @@ -388,7 +376,7 @@ class ActivateArtifact(command.Lister): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = glare_utils.get_artifact_id(client, parsed_args) data = client.artifacts.activate(af_id, type_name=parsed_args.type_name) return print_artifact(client, data, parsed_args.type_name) @@ -426,7 +414,7 @@ class DeactivateArtifact(command.Lister): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = glare_utils.get_artifact_id(client, parsed_args) data = client.artifacts.deactivate(af_id, type_name=parsed_args.type_name) return print_artifact(client, data, parsed_args.type_name) @@ -464,7 +452,7 @@ class ReactivateArtifact(command.Lister): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = glare_utils.get_artifact_id(client, parsed_args) data = client.artifacts.reactivate(af_id, type_name=parsed_args.type_name) return print_artifact(client, data, parsed_args.type_name) @@ -502,7 +490,7 @@ class PublishArtifact(command.Lister): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = glare_utils.get_artifact_id(client, parsed_args) data = client.artifacts.publish(af_id, type_name=parsed_args.type_name) return print_artifact(client, data, parsed_args.type_name) @@ -545,7 +533,7 @@ class AddTag(command.Lister): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = glare_utils.get_artifact_id(client, parsed_args) data = client.artifacts.add_tag( af_id, tag_value=parsed_args.tag, type_name=parsed_args.type_name) return print_artifact(client, data, parsed_args.type_name) @@ -588,7 +576,7 @@ class RemoveTag(command.Lister): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = glare_utils.get_artifact_id(client, parsed_args) data = client.artifacts.remove_tag( af_id, tag_value=parsed_args.tag, type_name=parsed_args.type_name) return print_artifact(client, data, parsed_args.type_name) diff --git a/glareclient/osc/v1/blobs.py b/glareclient/osc/v1/blobs.py index b8e266d..23e9fbb 100644 --- a/glareclient/osc/v1/blobs.py +++ b/glareclient/osc/v1/blobs.py @@ -37,18 +37,6 @@ def _default_blob_property(type_name): utils.exit('Unknown artifact type. Please specify --blob-property.') -def get_artifact_id(client, parsed_args): - if parsed_args.id: - if parsed_args.artifact_version != 'latest': - LOG.warning('Specified version is not considered when ' - 'receiving of the artifact by ID.') - return parsed_args.name - - return client.artifacts.get_by_name(parsed_args.name, - version=parsed_args.artifact_version, - type_name=parsed_args.type_name)['id'] - - class UploadBlob(command.ShowOne): """Upload blob""" @@ -102,7 +90,7 @@ class UploadBlob(command.ShowOne): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = utils.get_artifact_id(client, parsed_args) if not parsed_args.blob_property: parsed_args.blob_property = _default_blob_property( @@ -186,7 +174,7 @@ class DownloadBlob(command.Command): if not parsed_args.blob_property: parsed_args.blob_property = _default_blob_property( parsed_args.type_name) - af_id = get_artifact_id(client, parsed_args) + af_id = utils.get_artifact_id(client, parsed_args) data = client.artifacts.download_blob(af_id, parsed_args.blob_property, type_name=parsed_args.type_name) @@ -258,7 +246,7 @@ class AddLocation(command.ShowOne): def take_action(self, parsed_args): LOG.debug('take_action({0})'.format(parsed_args)) client = self.app.client_manager.artifact - af_id = get_artifact_id(client, parsed_args) + af_id = utils.get_artifact_id(client, parsed_args) if not parsed_args.blob_property: parsed_args.blob_property = _default_blob_property( diff --git a/glareclient/tests/unit/osc/v1/test_blob.py b/glareclient/tests/unit/osc/v1/test_blob.py index 4451b89..1c68f1f 100644 --- a/glareclient/tests/unit/osc/v1/test_blob.py +++ b/glareclient/tests/unit/osc/v1/test_blob.py @@ -33,7 +33,7 @@ class TestUpload(testtools.TestCase): @mock.patch('glareclient.osc.v1.blobs.progressbar') @mock.patch('glareclient.osc.v1.blobs.sys') @mock.patch('glareclient.osc.v1.blobs.open', create=True) - @mock.patch('glareclient.osc.v1.blobs.get_artifact_id') + @mock.patch('glareclient.common.utils.get_artifact_id') def test_upload_file_progress(self, mock_get_id, mock_open, mock_sys, mock_progressbar): mock_parsed_args = mock.Mock(name='test-id', @@ -58,7 +58,7 @@ class TestUpload(testtools.TestCase): @mock.patch('glareclient.osc.v1.blobs.sys') @mock.patch('glareclient.osc.v1.blobs.open', create=True) - @mock.patch('glareclient.osc.v1.blobs.get_artifact_id') + @mock.patch('glareclient.common.utils.get_artifact_id') def test_upload_file_no_progress(self, mock_get_id, mock_open, mock_sys): mock_parsed_args = mock.Mock(name='test-id', id=True, @@ -80,7 +80,7 @@ class TestUpload(testtools.TestCase): assert_called_once_with(*upload_args, **upload_kwargs) @mock.patch('glareclient.osc.v1.blobs.sys') - @mock.patch('glareclient.osc.v1.blobs.get_artifact_id') + @mock.patch('glareclient.common.utils.get_artifact_id') def test_upload_file_stdin(self, mock_get_id, mock_sys): mock_sys.stdin.isatty.return_value = False mock_parsed_args = mock.Mock(name='test-id', diff --git a/glareclient/v1/artifacts.py b/glareclient/v1/artifacts.py index 88d9f35..55d7776 100644 --- a/glareclient/v1/artifacts.py +++ b/glareclient/v1/artifacts.py @@ -110,13 +110,32 @@ class Controller(object): """Get information about an artifact by name. :param name: name of the artifact to get. + :param version: version of the artifact to get + :param type_name: type name of the artifact """ type_name = self._check_type_name(type_name) url = '/artifacts/%s?version=%s&name=%s' % (type_name, version, name) resp, body = self.http_client.get(url) - if not body[type_name]: - utils.exit('Artifact with name=%s and version=%s not found.' % - (name, version)) + arts = body[type_name] + if not arts: + msg = ('Artifact with name=%s and version=%s not found.' % + (name, version)) + raise exc.BadRequest(msg) + if len(arts) > 1: + if type_name != "all": + output = "\n".join([ + "Artifact: %s, owner: %s, visibility: %s" % ( + i['id'], i['owner'], i['visibility']) for i in arts]) + else: + output = "\n".join([ + "Artifact: %s, owner: %s, visibility: %s, type: %s" % ( + i['id'], i['owner'], i['visibility'], i['type_name']) + for i in arts]) + msg = ( + 'There are more then one artifact with name=%s and version=%s.' + ' Please provide the concrete id from the list:\n%s' % + (name, version, output)) + raise exc.BadRequest(msg) return body[type_name][0] def list(self, type_name=None, **kwargs):