From 2282142e4f2610577b2119280eb4688ca721054c Mon Sep 17 00:00:00 2001 From: Thiago da Silva Date: Tue, 12 Nov 2013 15:26:10 -0500 Subject: fix metadata overwrite during a post request During a post request, the object-server is ovewriting the existing object metadata. This fix prevents the overwrite of the system metadata while it allows for the user to add/remove user metadata Change-Id: Ic62cd064589b625ee425a9934be8766650622c13 Signed-off-by: Thiago da Silva Reviewed-on: http://review.gluster.org/6254 Reviewed-by: Luis Pabon Tested-by: Luis Pabon --- test/unit/obj/test_diskfile.py | 92 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/unit/obj/test_diskfile.py b/test/unit/obj/test_diskfile.py index 27ff51e..bd34eb1 100644 --- a/test/unit/obj/test_diskfile.py +++ b/test/unit/obj/test_diskfile.py @@ -414,7 +414,97 @@ class TestDiskFile(unittest.TestCase): assert gdf._metadata is None fmd = _metadata[_mapit(the_dir)] md.update({'X-Object-Type': 'file', 'X-Type': 'Object'}) - assert fmd == md, "on-disk md = %r, md = %r" % (fmd, md) + assert fmd['a'] == md['a'] + assert fmd['Content-Type'] == md['Content-Type'] + + def test_add_metadata_to_existing_file(self): + the_path = os.path.join(self.td, "vol0", "bar") + the_file = os.path.join(the_path, "z") + os.makedirs(the_path) + with open(the_file, "wb") as fd: + fd.write("1234") + ini_md = { + 'X-Type': 'Object', + 'X-Object-Type': 'file', + 'Content-Length': 4, + 'ETag': 'etag', + 'X-Timestamp': 'ts', + 'Content-Type': 'application/loctet-stream'} + _metadata[_mapit(the_file)] = ini_md + gdf = self._get_diskfile("vol0", "p57", "ufo47", "bar", "z") + md = {'Content-Type': 'application/octet-stream', 'a': 'b'} + gdf.put_metadata(md.copy()) + self.assertTrue(_metadata[_mapit(the_file)]['a'], 'b') + newmd = {'X-Object-Meta-test':'1234'} + gdf.put_metadata(newmd.copy()) + on_disk_md = _metadata[_mapit(the_file)] + self.assertTrue(on_disk_md['Content-Length'], 4) + self.assertTrue(on_disk_md['X-Object-Meta-test'], '1234') + self.assertTrue(on_disk_md['X-Type'], 'Object') + self.assertTrue(on_disk_md['X-Object-Type'], 'file') + self.assertTrue(on_disk_md['ETag'], 'etag') + self.assertFalse('a' in on_disk_md) + + def test_add_md_to_existing_file_with_md_in_gdf(self): + the_path = os.path.join(self.td, "vol0", "bar") + the_file = os.path.join(the_path, "z") + os.makedirs(the_path) + with open(the_file, "wb") as fd: + fd.write("1234") + ini_md = { + 'X-Type': 'Object', + 'X-Object-Type': 'file', + 'Content-Length': 4, + 'name': 'z', + 'ETag': 'etag', + 'X-Timestamp': 'ts'} + _metadata[_mapit(the_file)] = ini_md + gdf = self._get_diskfile("vol0", "p57", "ufo47", "bar", "z") + + # make sure gdf has the _metadata + gdf.open() + md = {'a': 'b'} + gdf.put_metadata(md.copy()) + self.assertTrue(_metadata[_mapit(the_file)]['a'], 'b') + newmd = {'X-Object-Meta-test':'1234'} + gdf.put_metadata(newmd.copy()) + on_disk_md = _metadata[_mapit(the_file)] + self.assertTrue(on_disk_md['Content-Length'], 4) + self.assertTrue(on_disk_md['X-Object-Meta-test'], '1234') + self.assertFalse('a' in on_disk_md) + + def test_add_metadata_to_existing_dir(self): + the_cont = os.path.join(self.td, "vol0", "bar") + the_dir = os.path.join(the_cont, "dir") + os.makedirs(the_dir) + gdf = self._get_diskfile("vol0", "p57", "ufo47", "bar", "dir") + self.assertEquals(gdf._metadata, None) + init_md = { + 'X-Type': 'Object', + 'Content-Length': 0, + 'ETag': 'etag', + 'X-Timestamp': 'ts', + 'X-Object-Meta-test':'test', + 'Content-Type': 'application/directory'} + _metadata[_mapit(the_dir)] = init_md + + md = {'X-Object-Meta-test':'test'} + gdf.put_metadata(md.copy()) + self.assertEqual(_metadata[_mapit(the_dir)]['X-Object-Meta-test'], + 'test') + self.assertEqual(_metadata[_mapit(the_dir)]['Content-Type'].lower(), + 'application/directory') + + # set new metadata + newmd = {'X-Object-Meta-test2':'1234'} + gdf.put_metadata(newmd.copy()) + self.assertEqual(_metadata[_mapit(the_dir)]['Content-Type'].lower(), + 'application/directory') + self.assertEqual(_metadata[_mapit(the_dir)]["X-Object-Meta-test2"], + '1234') + self.assertEqual(_metadata[_mapit(the_dir)]['X-Object-Type'], + DIR_OBJECT) + self.assertFalse('X-Object-Meta-test' in _metadata[_mapit(the_dir)]) def test_put_w_tombstone(self): gdf = self._get_diskfile("vol0", "p57", "ufo47", "bar", "z") -- cgit