Fix creation of artifact with ':' in names.

Currently to prevent name/version colisions we look
for artifact with the same name/version before creation.
To do this we use simple 'list' operation. Unfortunately,
if name or version contains ':', it is considered as filter_op
delimeter and Glare returns 400 for these cases.

This code fixes this and adds explicit operator 'eq:' for each
value.

Change-Id: I7760019cdbe1f6e8c5bf1c3b22a3cf07392aff19
Closes-bug: #1697698
This commit is contained in:
Mike Fedosin 2017-06-13 17:47:09 +03:00
parent 8ef98671cb
commit e3a3adaae2
3 changed files with 43 additions and 11 deletions

View File

@ -280,9 +280,9 @@ class BaseArtifact(base.VersionedObject):
:param is_public: flag that indicates to search artifact globally
"""
if version is not None and name not in (None, ""):
filters = [('name', name), ('version', version)]
filters = [('name', 'eq:' + name), ('version', 'eq:' + version)]
if is_public is False:
filters.extend([('owner', context.tenant),
filters.extend([('owner', 'eq:' + context.tenant),
('visibility', 'private')])
else:
filters.extend([('visibility', 'public')])

View File

@ -21,17 +21,37 @@ class TestArtifactCreate(base.BaseTestArtifactAPI):
"""Test Glare artifact creation."""
def test_create_artifact_minimal(self):
values = {'name': 'ttt'}
for name in ['ttt', 'tt:t', 'tt t', 'tt: t', 'tt,t']:
values = {'name': name}
res = self.controller.create(self.req, 'sample_artifact', values)
self.assertEqual(name, res['name'])
self.assertEqual('0.0.0', res['version'])
self.assertEqual(self.users['user1']['tenant_id'], res['owner'])
self.assertEqual('drafted', res['status'])
self.assertEqual('private', res['visibility'])
self.assertEqual('', res['description'])
self.assertEqual({}, res['metadata'])
self.assertEqual([], res['tags'])
def test_create_artifact_with_version(self):
values = {'name': 'name', 'version': '1.0'}
res = self.controller.create(self.req, 'sample_artifact', values)
self.assertEqual('ttt', res['name'])
self.assertEqual('0.0.0', res['version'])
self.assertEqual(self.users['user1']['tenant_id'], res['owner'])
self.assertEqual('drafted', res['status'])
self.assertEqual('private', res['visibility'])
self.assertEqual('', res['description'])
self.assertEqual({}, res['metadata'])
self.assertEqual([], res['tags'])
self.assertEqual('name', res['name'])
self.assertEqual('1.0.0', res['version'])
values = {'name': 'name', 'version': '1:0'}
res = self.controller.create(self.req, 'sample_artifact', values)
self.assertEqual('1.0.0-0', res['version'])
values = {'name': 'name', 'version': '1:0:0'}
res = self.controller.create(self.req, 'sample_artifact', values)
self.assertEqual('1.0.0-0-0', res['version'])
values = {'name': 'name', 'version': '2:0-0'}
res = self.controller.create(self.req, 'sample_artifact', values)
self.assertEqual('2.0.0-0-0', res['version'])
def test_create_artifact_with_fields(self):
values = {'name': 'ttt', 'version': '1.0',
@ -68,6 +88,10 @@ class TestArtifactCreate(base.BaseTestArtifactAPI):
self.assertRaises(exc.BadRequest, self.controller.create,
self.req, 'sample_artifact', values)
values = {'name': 'test', 'version': ':'}
self.assertRaises(exc.BadRequest, self.controller.create,
self.req, 'sample_artifact', values)
values = {'name': '', 'version': '1.0'}
self.assertRaises(exc.BadRequest, self.controller.create,
self.req, 'sample_artifact', values)

View File

@ -104,6 +104,10 @@ class TestArtifactUpdate(base.BaseTestArtifactAPI):
res = self.update_with_values(changes)
self.assertEqual('1.0', res['name'])
changes = [{'op': 'replace', 'path': '/name', 'value': "tt:t"}]
res = self.update_with_values(changes)
self.assertEqual('tt:t', res['name'])
# version
changes = [{'op': 'replace', 'path': '/version', 'value': 2.0}]
res = self.update_with_values(changes)
@ -113,6 +117,10 @@ class TestArtifactUpdate(base.BaseTestArtifactAPI):
res = self.update_with_values(changes)
self.assertEqual('1.0.0-alpha', res['version'])
changes = [{'op': 'replace', 'path': '/version', 'value': '1:0'}]
res = self.update_with_values(changes)
self.assertEqual('1.0.0-0', res['version'])
def test_update_deleted_artifact(self):
# Enable delayed delete
self.config(delayed_delete=True)