Raise error if there are more than 1 artifact with same name/version

Change-Id: Ifa69a12de15b854c6b27d2b3edd37d0eb47eabf8
This commit is contained in:
Mike Fedosin 2017-04-05 23:55:44 +03:00
parent bcc6c0d821
commit f79904c3f2
5 changed files with 51 additions and 42 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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(

View File

@ -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',

View File

@ -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):