diff --git a/glare/engine.py b/glare/engine.py index 813d496..797774f 100644 --- a/glare/engine.py +++ b/glare/engine.py @@ -565,9 +565,14 @@ class Engine(object): policy.authorize(action_name, af.to_dict(), context) # create an an empty blob instance in db with 'saving' status - if self._get_blob_info(af, field_name, blob_key): - msg = _("Blob %(blob)s already exists for artifact " - "%(af)s") % {'blob': field_name, 'af': af.id} + existing_blob = self._get_blob_info(af, field_name, blob_key) + existing_blob_status = existing_blob.get("status")\ + if existing_blob else None + if existing_blob_status == "saving": + msg = _("Blob %(blob)s already exists for artifact and it" + "is in %(status) %(af)s") % { + 'blob': field_name, 'af': af.id, + 'status': existing_blob_status} raise exception.Conflict(message=msg) utils.validate_change_allowed(af, field_name) blob_info['size'] = self._calculate_allowed_space( diff --git a/glare/tests/functional/test_database_store.py b/glare/tests/functional/test_database_store.py index c5bf089..6141824 100644 --- a/glare/tests/functional/test_database_store.py +++ b/glare/tests/functional/test_database_store.py @@ -116,13 +116,13 @@ default_store = database self.assertNotIn('id', art['blob']) # reUpload file to artifact - self.put(url=url + '/blob', data=data, status=409, + self.put(url=url + '/blob', data=data, status=200, headers=headers) # upload blob dict self.put(url + '/dict_of_blobs/test_key', data=data, headers=headers) - # test re-upload failed + # test re-upload for dict of blob self.put(url + '/dict_of_blobs/test_key', data=data, headers=headers, - status=409) + status=200) # upload few other blobs to the dict for elem in ('aaa', 'bbb', 'ccc', 'ddd'): diff --git a/glare/tests/functional/test_sample_artifact.py b/glare/tests/functional/test_sample_artifact.py index 06ad15b..a72e8e0 100644 --- a/glare/tests/functional/test_sample_artifact.py +++ b/glare/tests/functional/test_sample_artifact.py @@ -745,13 +745,13 @@ class TestBlobs(base.TestArtifact): self.assertEqual(exp_blob_url, art['blob']['url']) # reUpload file to artifact - self.put(url=url + '/blob', data=data, status=409, + self.put(url=url + '/blob', data=data, status=200, headers=headers) # upload blob dict self.put(url + '/dict_of_blobs/test_key', data=data, headers=headers) - # test re-upload failed + # test re-upload for dict of blob. self.put(url + '/dict_of_blobs/test_key', data=data, headers=headers, - status=409) + status=200) # upload few other blobs to the dict for elem in ('aaa', 'bbb', 'ccc', 'ddd'): diff --git a/glare/tests/unit/api/test_upload.py b/glare/tests/unit/api/test_upload.py index 9ea2461..e2f7ffd 100644 --- a/glare/tests/unit/api/test_upload.py +++ b/glare/tests/unit/api/test_upload.py @@ -57,11 +57,14 @@ class TestArtifactUpload(base.BaseTestArtifactAPI): self.assertEqual(3, artifact['blob']['size']) self.assertEqual('active', artifact['blob']['status']) - # Re-uploading blob leads to Conflict error - self.assertRaises( - exc.Conflict, self.controller.upload_blob, + # Re-uploading blob + self.controller.upload_blob( self.req, 'sample_artifact', self.sample_artifact['id'], 'blob', - BytesIO(b'aaa'), 'application/octet-stream') + BytesIO(b'aaabb'), 'application/octet-stream') + artifact = self.controller.show(self.req, 'sample_artifact', + self.sample_artifact['id']) + self.assertEqual(5, artifact['blob']['size']) + self.assertEqual('active', artifact['blob']['status']) def test_upload_saving_blob(self): self.controller.upload_blob( @@ -232,11 +235,15 @@ class TestArtifactUpload(base.BaseTestArtifactAPI): self.assertEqual(3, artifact['dict_of_blobs']['blb']['size']) self.assertEqual('active', artifact['dict_of_blobs']['blb']['status']) - # If blob key already exists Glare return Conflict error - self.assertRaises( - exc.Conflict, self.controller.upload_blob, + # Validate re-uploaded of blob content. + self.controller.upload_blob( self.req, 'sample_artifact', self.sample_artifact['id'], - 'dict_of_blobs/blb', BytesIO(b'aaa'), 'application/octet-stream') + 'dict_of_blobs/blb', BytesIO(b'aaabb'), + 'application/octet-stream') + + artifact = self.controller.show(self.req, 'sample_artifact', + self.sample_artifact['id']) + self.assertEqual(5, artifact['dict_of_blobs']['blb']['size']) def test_blob_dict_storage_error(self): self.config(default_store='filesystem',