Allowed to use the artifacts by name

Added the ability to access by name of the artifact.
To access the artifacts by 'id' must specify the appropriate flag.

Change-Id: I776cd8cb0c15fb58891ae7f06d1c1272a4f3478c
This commit is contained in:
Darja Malyavkina 2016-10-05 14:05:36 +03:00
parent b8d2760fe5
commit 6abe210de2
8 changed files with 285 additions and 65 deletions

View File

@ -42,6 +42,18 @@ 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.warn('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"""
@ -118,18 +130,31 @@ class ShowArtifact(command.Lister):
help='Name of artifact type.',
),
parser.add_argument(
'id',
metavar='<ID>',
help='ID of the artifact to update.',
)
'name',
metavar='<NAME>',
help='Name or id of the artifact to show.',
),
parser.add_argument(
'--artifact-version', '-v',
metavar='<VERSION>',
default='latest',
help='Version of the artifact.',
),
parser.add_argument(
'--id', '-i',
action='store_true',
help='The specified id of the artifact.',
),
return parser
def take_action(self, parsed_args):
LOG.debug('take_action({0})'.format(parsed_args))
client = self.app.client_manager.artifact
data = client.artifacts.get(parsed_args.id,
af_id = get_artifact_id(client, parsed_args)
data = client.artifacts.get(af_id,
type_name=parsed_args.type_name)
return print_artifact(client, data, parsed_args.type_name)
@ -200,7 +225,18 @@ class UpdateArtifact(command.Lister):
parser.add_argument(
'--name', '-n',
metavar='<NAME>',
help='Name of the artifact.',
help='Name or id of the artifact to update.',
),
parser.add_argument(
'--artifact-version', '-v',
metavar='<VERSION>',
default='latest',
help='Version of the artifact.',
),
parser.add_argument(
'--id', '-i',
action='store_true',
help='The specified id of the artifact.',
),
parser.add_argument(
'--remove-property', '-r',
@ -208,7 +244,7 @@ class UpdateArtifact(command.Lister):
action='append',
default=[],
help='Property that will be removed.'
)
),
parser.add_argument(
'--property', '-p',
metavar='<key=value>',
@ -227,8 +263,9 @@ class UpdateArtifact(command.Lister):
prop[key] = value
client = self.app.client_manager.artifact
af_id = get_artifact_id(client, parsed_args)
data = client.artifacts.update(
parsed_args.id, type_name=parsed_args.type_name,
af_id, type_name=parsed_args.type_name,
remove_props=parsed_args.remove_property, **prop)
return print_artifact(client, data, parsed_args.type_name)
@ -246,16 +283,28 @@ class DeleteArtifact(command.Command):
help='Name of artifact type.',
),
parser.add_argument(
'id',
metavar='<ID>',
help='ID of the artifact to update.',
)
'name',
metavar='<NAME>',
help='Name or id of the artifact to delete.',
),
parser.add_argument(
'--artifact-version', '-v',
metavar='<VERSION>',
default='latest',
help='Version of the artifact.',
),
parser.add_argument(
'--id', '-i',
action='store_true',
help='The specified id of the artifact.',
),
return parser
def take_action(self, parsed_args):
LOG.debug('take_action({0})'.format(parsed_args))
client = self.app.client_manager.artifact
client.artifacts.delete(parsed_args.id,
af_id = get_artifact_id(client, parsed_args)
client.artifacts.delete(af_id,
type_name=parsed_args.type_name)
@ -271,17 +320,29 @@ class ActivateArtifact(command.Lister):
help='Name of artifact type.',
),
parser.add_argument(
'id',
metavar='<ID>',
help='ID of the artifact to update.',
)
'name',
metavar='<NAME>',
help='Name or id of the artifact to activate.',
),
parser.add_argument(
'--artifact-version', '-v',
metavar='<VERSION>',
default='latest',
help='Version of the artifact.',
),
parser.add_argument(
'--id', '-i',
action='store_true',
help='The specified id of the artifact.',
),
return parser
def take_action(self, parsed_args):
LOG.debug('take_action({0})'.format(parsed_args))
client = self.app.client_manager.artifact
data = client.artifacts.activate(
parsed_args.id, type_name=parsed_args.type_name)
af_id = 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)
@ -297,16 +358,28 @@ class DeactivateArtifact(command.Lister):
help='Name of artifact type.',
),
parser.add_argument(
'id',
metavar='<ID>',
help='ID of the artifact to update.',
)
'name',
metavar='<NAME>',
help='Name or id of the artifact to deactivate.',
),
parser.add_argument(
'--artifact-version', '-v',
metavar='<VERSION>',
default='latest',
help='Version of the artifact.',
),
parser.add_argument(
'--id', '-i',
action='store_true',
help='The specified id of the artifact.',
),
return parser
def take_action(self, parsed_args):
LOG.debug('take_action({0})'.format(parsed_args))
client = self.app.client_manager.artifact
data = client.artifacts.deactivate(parsed_args.id,
af_id = 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)
@ -323,16 +396,28 @@ class ReactivateArtifact(command.Lister):
help='Name of artifact type.',
),
parser.add_argument(
'id',
metavar='<ID>',
help='ID of the artifact to update.',
)
'name',
metavar='<NAME>',
help='Name or id of the artifact to reactivate.',
),
parser.add_argument(
'--artifact-version', '-v',
metavar='<VERSION>',
default='latest',
help='Version of the artifact.',
),
parser.add_argument(
'--id', '-i',
action='store_true',
help='The specified id of the artifact.',
),
return parser
def take_action(self, parsed_args):
LOG.debug('take_action({0})'.format(parsed_args))
client = self.app.client_manager.artifact
data = client.artifacts.reactivate(parsed_args.id,
af_id = 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)
@ -349,16 +434,28 @@ class PublishArtifact(command.Lister):
help='Name of artifact type.',
),
parser.add_argument(
'id',
metavar='<ID>',
help='ID of the artifact to update.',
)
'name',
metavar='<NAME>',
help='Name or id of the artifact to publish.',
),
parser.add_argument(
'--artifact-version', '-v',
metavar='<VERSION>',
default='latest',
help='Version of the artifact.',
),
parser.add_argument(
'--id', '-i',
action='store_true',
help='The specified id of the artifact.',
),
return parser
def take_action(self, parsed_args):
LOG.debug('take_action({0})'.format(parsed_args))
client = self.app.client_manager.artifact
data = client.artifacts.publish(parsed_args.id,
af_id = 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)

View File

@ -36,6 +36,18 @@ 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.warn('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"""
@ -48,10 +60,21 @@ class UploadBlob(command.ShowOne):
help='Name of artifact type.',
),
parser.add_argument(
'id',
metavar='<ID>',
help='ID of the artifact to update.',
)
'name',
metavar='<NAME>',
help='Name or id of the artifact to upload.',
),
parser.add_argument(
'--artifact-version', '-v',
metavar='<VERSION>',
default='latest',
help='Version of the artifact.',
),
parser.add_argument(
'--id', '-i',
action='store_true',
help='The specified id of the artifact.',
),
parser.add_argument(
'--file',
metavar='<FILE_PATH>',
@ -78,6 +101,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)
if not parsed_args.blob_property:
parsed_args.blob_property = _default_blob_property(
@ -89,13 +113,11 @@ class UploadBlob(command.ShowOne):
if file_size is not None:
blob = progressbar.VerboseFileWrapper(blob, file_size)
client.artifacts.upload_blob(parsed_args.id,
parsed_args.blob_property, blob,
client.artifacts.upload_blob(af_id, parsed_args.blob_property, blob,
content_type=parsed_args.content_type,
type_name=parsed_args.type_name)
data = client.artifacts.get(parsed_args.id,
type_name=parsed_args.type_name)
data = client.artifacts.get(af_id, type_name=parsed_args.type_name)
data_to_display = {'blob_property': parsed_args.blob_property}
data_to_display.update(data[parsed_args.blob_property])
@ -114,10 +136,21 @@ class DownloadBlob(command.Command):
help='Name of artifact type.',
),
parser.add_argument(
'id',
metavar='<ID>',
help='ID of the artifact to update.',
)
'name',
metavar='<NAME>',
help='Name or id of the artifact to download.',
),
parser.add_argument(
'--artifact-version', '-v',
metavar='<VERSION>',
default='latest',
help='Version of the artifact.',
),
parser.add_argument(
'--id', '-i',
action='store_true',
help='The specified id of the artifact.',
),
parser.add_argument(
'--progress',
action='store_true',
@ -144,7 +177,8 @@ class DownloadBlob(command.Command):
if not parsed_args.blob_property:
parsed_args.blob_property = _default_blob_property(
parsed_args.type_name)
data = client.artifacts.download_blob(parsed_args.id,
af_id = get_artifact_id(client, parsed_args)
data = client.artifacts.download_blob(af_id,
parsed_args.blob_property,
type_name=parsed_args.type_name)
if parsed_args.progress:
@ -170,10 +204,21 @@ class AddLocation(command.ShowOne):
help='Name of artifact type.',
),
parser.add_argument(
'id',
metavar='<ID>',
help='ID of the artifact to update.',
)
'name',
metavar='<NAME>',
help='Name or id of the artifact to download.',
),
parser.add_argument(
'--artifact-version', '-v',
metavar='<VERSION>',
default='latest',
help='Version of the artifact.',
),
parser.add_argument(
'--id', '-i',
action='store_true',
help='The specified id of the artifact.',
),
parser.add_argument(
'--url',
metavar='<FILE_PATH>',
@ -210,6 +255,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)
if not parsed_args.blob_property:
parsed_args.blob_property = _default_blob_property(
@ -223,13 +269,13 @@ class AddLocation(command.ShowOne):
}
client.artifacts.add_external_location(
parsed_args.id,
af_id,
parsed_args.blob_property,
data,
content_type=parsed_args.content_type,
type_name=parsed_args.type_name)
data = client.artifacts.get(parsed_args.id,
data = client.artifacts.get(af_id,
type_name=parsed_args.type_name)
data_to_display = {'blob_property': parsed_args.blob_property}

View File

@ -88,6 +88,7 @@ class TestArtifacts(utils.TestCommand):
self.app.client_manager.artifact = mock.MagicMock()
self.app.client_manager.artifact.artifacts.list = mock_list
self.app.client_manager.artifact.artifacts.get = mock_get
self.app.client_manager.artifact.artifacts.get_by_name = mock_get
self.app.client_manager.artifact.artifacts.create = mock_g_servs
self.app.client_manager.artifact.artifacts.update = mock_g_servs
self.app.client_manager.artifact.artifacts.delete = mock_g_servs

View File

@ -153,6 +153,20 @@ class TestShowArtifacts(TestArtifacts):
with testtools.ExpectedException(ParserException):
self.check_parser(self.cmd, arglist, verify)
def test_artifact_show_by_name(self):
arglist = ['images', 'name1']
verify = [('type_name', 'images'), ('id', False)]
COLUMNS = set(['blob', 'environment', 'id', 'image',
'name', 'owner', 'package', 'status',
'template', 'version', 'visibility'])
parsed_args = self.check_parser(self.cmd, arglist, verify)
columns, data = self.cmd.take_action(parsed_args)
name_fields = set([column[0] for column in data])
# Check that columns are correct
self.assertEqual(COLUMNS, name_fields)
class TestCreateArtifacts(TestArtifacts):
@ -258,9 +272,10 @@ class TestDeleteArtifacts(TestArtifacts):
def test_artifact_delete(self):
arglist = ['images',
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba']
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba', '--id']
verify = [('type_name', 'images'),
('id', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba')]
('name', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba'),
('id', True)]
parsed_args = self.check_parser(self.cmd, arglist, verify)
self.assertIsNone(self.cmd.take_action(parsed_args))
@ -277,9 +292,11 @@ class TestActivateArtifacts(TestArtifacts):
def test_artifact_activate(self):
arglist = ['images',
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba']
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba',
'--id']
verify = [('type_name', 'images'),
('id', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba')]
('name', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba'),
('id', True)]
parsed_args = self.check_parser(self.cmd, arglist, verify)
columns, data = self.cmd.take_action(parsed_args)
@ -300,9 +317,10 @@ class TestDeactivateArtifacts(TestArtifacts):
def test_artifact_deactivate(self):
arglist = ['images',
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba']
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba', '--id']
verify = [('type_name', 'images'),
('id', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba')]
('name', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba'),
('id', True)]
parsed_args = self.check_parser(self.cmd, arglist, verify)
columns, data = self.cmd.take_action(parsed_args)
@ -323,9 +341,10 @@ class TestReactivateArtifacts(TestArtifacts):
def test_artifact_rectivate(self):
arglist = ['images',
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba']
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba', '--id']
verify = [('type_name', 'images'),
('id', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba')]
('name', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba'),
('id', True)]
parsed_args = self.check_parser(self.cmd, arglist, verify)
columns, data = self.cmd.take_action(parsed_args)
@ -346,9 +365,10 @@ class TestPublishArtifacts(TestArtifacts):
def test_publish_delete(self):
arglist = ['images',
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba']
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba', '--id']
verify = [('type_name', 'images'),
('id', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba')]
('name', 'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba'),
('id', True)]
parsed_args = self.check_parser(self.cmd, arglist, verify)
columns, data = self.cmd.take_action(parsed_args)

View File

@ -251,7 +251,7 @@ class TestAddLocation(TestBlobs):
def test_add_location(self):
arglist = ['images',
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba',
'fc15c365-d4f9-4b8b-a090-d9e230f1f6ba', '--id',
'--url', 'fake_url',
'--md5', "35d83e8eedfbdb87ff97d1f2761f8ebf",
'--sha1', "942854360eeec1335537702399c5aed940401602",

View File

@ -214,5 +214,33 @@ data_fixtures = {
'properties': {'foo': 'bar'}
}}}
)
}
},
'/artifacts/images?name=name1&version=latest': {
'GET': (
# headers
{},
# response
{'images': [
{
'name': 'name1',
'id': '3a4560a1-e585-443e-9b39-553b46ec92d1',
'version': '3.0.0'
}
]},
),
},
'/artifacts/images?name=name1&version=1.0.0': {
'GET': (
# headers
{},
# response
{'images': [
{
'name': 'name1',
'id': '3a4560a1-e585-443e-9b39-553b46ec92d1',
'version': '1.0.0'
}
]},
),
},
}

View File

@ -368,6 +368,21 @@ class TestController(testtools.TestCase):
self.assertEqual(art_id, art['images'][0]['id'])
self.assertEqual('art_1', art['images'][0]['name'])
def test_get_by_name(self):
art_name = 'name1'
art = self.controller.get_by_name(name=art_name,
type_name='images')
self.assertEqual(art_name, art['name'])
self.assertEqual('3.0.0', art['version'])
def test_get_by_name_with_version(self):
art_name = 'name1'
art = self.controller.get_by_name(name=art_name,
version='1.0.0',
type_name='images')
self.assertEqual(art_name, art['name'])
self.assertEqual('1.0.0', art['version'])
def test_type_list(self):
data = self.controller.get_type_list()
expect_data = [('images', '1.0'), ('heat_environments', '1.0')]

View File

@ -104,6 +104,19 @@ class Controller(object):
resp, body = self.http_client.get(url)
return body
def get_by_name(self, name, version='latest', type_name=None):
"""Get information about an artifact by name.
:param name: name of the artifact to get.
"""
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))
return body[type_name][0]
def list(self, type_name=None, **kwargs):
"""Retrieve a listing of artifacts objects.