Esempio n. 1
0
    def test_get_data_file_size_os_err(self):
        td = tempfile.mkdtemp()
        the_path = os.path.join(td, "vol0", "bar")
        the_file = os.path.join(the_path, "z")
        try:
            os.makedirs(the_path)
            with open(the_file, "wb") as fd:
                fd.write("1234")
            gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                   "z", self.lg)
            assert gdf._obj == "z"
            assert gdf.data_file == the_file
            assert not gdf._is_dir
            stats = os.stat(the_path)
            try:
                os.chmod(the_path, 0)

                def _mock_getsize_eaccess_err(f):
                    raise OSError(errno.EACCES, os.strerror(errno.EACCES))

                with patch("os.path.getsize", _mock_getsize_eaccess_err):
                    try:
                        gdf.get_data_file_size()
                    except OSError as err:
                        assert err.errno == errno.EACCES
                    else:
                        self.fail("Expected OSError exception")
            finally:
                os.chmod(the_path, stats.st_mode)
        finally:
            shutil.rmtree(td)
Esempio n. 2
0
    def test_put_obj_path(self):
        the_obj_path = os.path.join("b", "a")
        the_file = os.path.join(the_obj_path, "z")
        td = tempfile.mkdtemp()
        try:
            gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                   the_file, self.lg)
            assert gdf._obj == "z"
            assert gdf._obj_path == the_obj_path
            assert gdf.name == os.path.join("bar", "b", "a")
            assert gdf.datadir == os.path.join(td, "vol0", "bar", "b", "a")
            assert gdf.data_file is None

            body = '1234\n'
            etag = md5()
            etag.update(body)
            etag = etag.hexdigest()
            metadata = {
                'X-Timestamp': '1234',
                'Content-Type': 'file',
                'ETag': etag,
                'Content-Length': '5',
                }

            with gdf.writer() as dw:
                assert dw.tmppath is not None
                tmppath = dw.tmppath
                dw.write(body)
                dw.put(metadata)

            assert gdf.data_file == os.path.join(td, "vol0", "bar", "b", "a", "z")
            assert os.path.exists(gdf.data_file)
            assert not os.path.exists(tmppath)
        finally:
            shutil.rmtree(td)
Esempio n. 3
0
 def test_put_is_dir(self):
     td = tempfile.mkdtemp()
     the_path = os.path.join(td, "vol0", "bar")
     the_dir = os.path.join(the_path, "dir")
     try:
         os.makedirs(the_dir)
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                "dir", self.lg)
         origmd = gdf.metadata.copy()
         origfmd = _metadata[the_dir]
         newmd = gdf.metadata.copy()
         # FIXME: This is a hack to get to the code-path; it is not clear
         # how this can happen normally.
         newmd['Content-Type'] = ''
         newmd['X-Object-Meta-test'] = '1234'
         with gdf.writer() as dw:
             try:
                 dw.put(newmd, extension='.data')
             except DiskFileError:
                 pass
             else:
                 self.fail("Expected to encounter"
                           " 'already-exists-as-dir' exception")
         assert gdf.metadata == origmd
         assert _metadata[the_dir] == origfmd
     finally:
         shutil.rmtree(td)
Esempio n. 4
0
    def test_put_w_tombstone(self):
        assert not os.path.exists("/tmp/foo")
        gdf = DiskFile("/tmp/foo", "vol0", "p57", "ufo47", "bar", "z", self.lg)
        assert gdf.metadata == {}

        gdf.put_metadata({'x': '1'}, tombstone=True)
        assert gdf.metadata == {}
Esempio n. 5
0
 def test_writer(self):
     td = tempfile.mkdtemp()
     try:
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                "dir/z", self.lg)
         saved_tmppath = ''
         saved_fd = None
         with gdf.writer() as dw:
             assert gdf.datadir == os.path.join(td, "vol0", "bar", "dir")
             assert os.path.isdir(gdf.datadir)
             saved_tmppath = dw.tmppath
             assert os.path.dirname(saved_tmppath) == gdf.datadir
             assert os.path.basename(saved_tmppath)[:3] == '.z.'
             assert os.path.exists(saved_tmppath)
             dw.write("123")
             saved_fd = dw.fd
         # At the end of previous with block a close on fd is called.
         # Calling os.close on the same fd will raise an OSError
         # exception and we must catch it.
         try:
             os.close(saved_fd)
         except OSError:
             pass
         else:
             self.fail("Exception expected")
         assert not os.path.exists(saved_tmppath)
     finally:
         shutil.rmtree(td)
Esempio n. 6
0
 def test_get_data_file_size_dne(self):
     assert not os.path.exists("/tmp/foo")
     gdf = DiskFile("/tmp/foo", "vol0", "p57", "ufo47", "bar",
                            "/b/a/z/", self.lg)
     try:
         gdf.get_data_file_size()
     except DiskFileNotExist:
         pass
     else:
         self.fail("Expected DiskFileNotExist exception")
Esempio n. 7
0
 def test_put_metadata(self):
     td = tempfile.mkdtemp()
     the_path = os.path.join(td, "vol0", "bar")
     the_dir = os.path.join(the_path, "z")
     try:
         os.makedirs(the_dir)
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar", "z", self.lg)
         md = { 'Content-Type': 'application/octet-stream', 'a': 'b' }
         gdf.put_metadata(md.copy())
         assert gdf.metadata == md, "gdf.metadata = %r, md = %r" % (gdf.metadata, md)
         assert _metadata[the_dir] == md
     finally:
         shutil.rmtree(td)
Esempio n. 8
0
 def test_unlinkold_no_metadata(self):
     assert not os.path.exists("/tmp/foo")
     gdf = DiskFile("/tmp/foo", "vol0", "p57", "ufo47", "bar",
                            "z", self.lg)
     assert gdf.metadata == {}
     _saved_rmobjdir = gluster.swift.obj.diskfile.rmobjdir
     gluster.swift.obj.diskfile.rmobjdir = _mock_rmobjdir
     try:
         gdf.unlinkold(None)
     except MockException as exp:
         self.fail(str(exp))
     finally:
         gluster.swift.obj.diskfile.rmobjdir = _saved_rmobjdir
Esempio n. 9
0
 def test_get_data_file_size_dir(self):
     td = tempfile.mkdtemp()
     the_path = os.path.join(td, "vol0", "bar")
     the_dir = os.path.join(the_path, "d")
     try:
         os.makedirs(the_dir)
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                "d", self.lg, keep_data_fp=True)
         assert gdf._obj == "d"
         assert gdf.data_file == the_dir
         assert gdf._is_dir
         assert 0 == gdf.get_data_file_size()
     finally:
         shutil.rmtree(td)
Esempio n. 10
0
    def test_close_no_open_fp(self):
        assert not os.path.exists("/tmp/foo")
        gdf = DiskFile("/tmp/foo", "vol0", "p57", "ufo47", "bar",
                               "z", self.lg, keep_data_fp=True)
        gdf._is_dir = False
        self.called = False

        def our_do_close(fp):
            self.called = True

        with mock.patch("gluster.swift.obj.diskfile.do_close", our_do_close):
            gdf.close()
            assert not self.called
            assert gdf.fp is None
Esempio n. 11
0
 def test_put_w_marker_dir(self):
     td = tempfile.mkdtemp()
     the_path = os.path.join(td, "vol0", "bar")
     the_dir = os.path.join(the_path, "dir")
     try:
         os.makedirs(the_dir)
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                "dir", self.lg)
         newmd = gdf.metadata.copy()
         newmd['X-Object-Meta-test'] = '1234'
         gdf.put_metadata(newmd)
         assert gdf.metadata == newmd
         assert _metadata[the_dir] == newmd
     finally:
         shutil.rmtree(td)
Esempio n. 12
0
 def test_create_dir_object_no_md(self):
     td = tempfile.mkdtemp()
     the_cont = os.path.join(td, "vol0", "bar")
     the_dir = "dir"
     try:
         os.makedirs(the_cont)
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                        os.path.join(the_dir, "z"), self.lg)
         # Not created, dir object path is different, just checking
         assert gdf._obj == "z"
         gdf._create_dir_object(the_dir)
         full_dir_path = os.path.join(the_cont, the_dir)
         assert os.path.isdir(full_dir_path)
         assert full_dir_path not in _metadata
     finally:
         shutil.rmtree(td)
Esempio n. 13
0
 def test_get_data_file_size(self):
     td = tempfile.mkdtemp()
     the_path = os.path.join(td, "vol0", "bar")
     the_file = os.path.join(the_path, "z")
     try:
         os.makedirs(the_path)
         with open(the_file, "wb") as fd:
             fd.write("1234")
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                "z", self.lg)
         assert gdf._obj == "z"
         assert gdf.data_file == the_file
         assert not gdf._is_dir
         assert 4 == gdf.get_data_file_size()
     finally:
         shutil.rmtree(td)
Esempio n. 14
0
 def test_put_w_meta_file(self):
     td = tempfile.mkdtemp()
     the_path = os.path.join(td, "vol0", "bar")
     the_file = os.path.join(the_path, "z")
     try:
         os.makedirs(the_path)
         with open(the_file, "wb") as fd:
             fd.write("1234")
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar", "z", self.lg)
         newmd = gdf.metadata.copy()
         newmd['X-Object-Meta-test'] = '1234'
         gdf.put_metadata(newmd)
         assert gdf.metadata == newmd
         assert _metadata[the_file] == newmd
     finally:
         shutil.rmtree(td)
Esempio n. 15
0
    def test_unlinkold_is_dir(self):
        td = tempfile.mkdtemp()
        the_path = os.path.join(td, "vol0", "bar")
        the_dir = os.path.join(the_path, "d")
        try:
            os.makedirs(the_dir)
            gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                   "d", self.lg, keep_data_fp=True)
            assert gdf.data_file == the_dir
            assert gdf._is_dir

            later = float(gdf.metadata['X-Timestamp']) + 1
            gdf.unlinkold(normalize_timestamp(later))
            assert os.path.isdir(gdf.datadir)
            assert not os.path.exists(os.path.join(gdf.datadir, gdf._obj))
        finally:
            shutil.rmtree(td)
Esempio n. 16
0
 def test_create_dir_object_with_md(self):
     td = tempfile.mkdtemp()
     the_cont = os.path.join(td, "vol0", "bar")
     the_dir = "dir"
     try:
         os.makedirs(the_cont)
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                        os.path.join(the_dir, "z"), self.lg)
         # Not created, dir object path is different, just checking
         assert gdf._obj == "z"
         dir_md = {'Content-Type': 'application/directory',
                   X_OBJECT_TYPE: DIR_OBJECT}
         gdf._create_dir_object(the_dir, dir_md)
         full_dir_path = os.path.join(the_cont, the_dir)
         assert os.path.isdir(full_dir_path)
         assert full_dir_path in _metadata
     finally:
         shutil.rmtree(td)
Esempio n. 17
0
 def test_writer_err_on_unlink(self):
     td = tempfile.mkdtemp()
     try:
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                "dir/z", self.lg)
         saved_tmppath = ''
         with gdf.writer() as dw:
             assert gdf.datadir == os.path.join(td, "vol0", "bar", "dir")
             assert os.path.isdir(gdf.datadir)
             saved_tmppath = dw.tmppath
             assert os.path.dirname(saved_tmppath) == gdf.datadir
             assert os.path.basename(saved_tmppath)[:3] == '.z.'
             assert os.path.exists(saved_tmppath)
             dw.write("123")
             os.unlink(saved_tmppath)
         assert not os.path.exists(saved_tmppath)
     finally:
         shutil.rmtree(td)
Esempio n. 18
0
    def test_put_rename_ENOENT(self):
        td = tempfile.mkdtemp()
        the_cont = os.path.join(td, "vol0", "bar")
        try:
            os.makedirs(the_cont)
            gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar", "z", self.lg)
            assert gdf._obj == "z"
            assert gdf._obj_path == ""
            assert gdf.name == "bar"
            assert gdf.datadir == the_cont
            assert gdf.data_file is None

            body = '1234\n'
            etag = md5()
            etag.update(body)
            etag = etag.hexdigest()
            metadata = {
                'X-Timestamp': '1234',
                'Content-Type': 'file',
                'ETag': etag,
                'Content-Length': '5',
                }

            def mock_sleep(*args, **kwargs):
                # Return without sleep, no need to dely unit tests
                return

            def mock_rename(*args, **kwargs):
                raise OSError(errno.ENOENT, os.strerror(errno.ENOENT))

            with mock.patch("gluster.swift.obj.diskfile.sleep", mock_sleep):
                with mock.patch("os.rename", mock_rename):
                    try:
                        with gdf.writer() as dw:
                            assert dw.tmppath is not None
                            tmppath = dw.tmppath
                            dw.write(body)
                            dw.put(metadata)
                    except GlusterFileSystemOSError:
                        pass
                    else:
                        self.fail("Expected exception DiskFileError")
        finally:
            shutil.rmtree(td)
Esempio n. 19
0
    def test_close_dir_object(self):
        td = tempfile.mkdtemp()
        the_cont = os.path.join(td, "vol0", "bar")
        the_dir = "dir"
        self.called = False
        try:
            os.makedirs(os.path.join(the_cont, "dir"))
            gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                   "dir", self.lg, keep_data_fp=True)

            def our_do_close(fp):
                self.called = True

            with mock.patch("gluster.swift.obj.diskfile.do_close",
                    our_do_close):
                gdf.close()
                assert self.called
        finally:
            shutil.rmtree(td)
Esempio n. 20
0
 def test_writer_err_on_close(self):
     td = tempfile.mkdtemp()
     try:
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                "dir/z", self.lg)
         saved_tmppath = ''
         with gdf.writer() as dw:
             assert gdf.datadir == os.path.join(td, "vol0", "bar", "dir")
             assert os.path.isdir(gdf.datadir)
             saved_tmppath = dw.tmppath
             assert os.path.dirname(saved_tmppath) == gdf.datadir
             assert os.path.basename(saved_tmppath)[:3] == '.z.'
             assert os.path.exists(saved_tmppath)
             dw.write("123")
             # Closing the fd prematurely should not raise any exceptions.
             os.close(dw.fd)
         assert not os.path.exists(saved_tmppath)
     finally:
         shutil.rmtree(td)
Esempio n. 21
0
    def test_unlinkold_file(self):
        td = tempfile.mkdtemp()
        the_path = os.path.join(td, "vol0", "bar")
        the_file = os.path.join(the_path, "z")
        try:
            os.makedirs(the_path)
            with open(the_file, "wb") as fd:
                fd.write("1234")
            gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                   "z", self.lg)
            assert gdf._obj == "z"
            assert gdf.data_file == the_file
            assert not gdf._is_dir

            later = float(gdf.metadata['X-Timestamp']) + 1
            gdf.unlinkold(normalize_timestamp(later))
            assert os.path.isdir(gdf.datadir)
            assert not os.path.exists(os.path.join(gdf.datadir, gdf._obj))
        finally:
            shutil.rmtree(td)
Esempio n. 22
0
    def test_put_ENOSPC(self):
        td = tempfile.mkdtemp()
        the_cont = os.path.join(td, "vol0", "bar")
        try:
            os.makedirs(the_cont)
            gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                   "z", self.lg)
            assert gdf._obj == "z"
            assert gdf._obj_path == ""
            assert gdf.name == "bar"
            assert gdf.datadir == the_cont
            assert gdf.data_file is None

            body = '1234\n'
            etag = md5()
            etag.update(body)
            etag = etag.hexdigest()
            metadata = {
                'X-Timestamp': '1234',
                'Content-Type': 'file',
                'ETag': etag,
                'Content-Length': '5',
                }

            def mock_open(*args, **kwargs):
                raise OSError(errno.ENOSPC, os.strerror(errno.ENOSPC))

            with mock.patch("os.open", mock_open):
                try:
                    with gdf.writer() as dw:
                        assert dw.tmppath is not None
                        dw.write(body)
                        dw.put(metadata)
                except DiskFileNoSpace:
                    pass
                else:
                    self.fail("Expected exception DiskFileNoSpace")
        finally:
            shutil.rmtree(td)
Esempio n. 23
0
 def test_get_data_file_size_dne_os_err(self):
     td = tempfile.mkdtemp()
     the_path = os.path.join(td, "vol0", "bar")
     the_file = os.path.join(the_path, "z")
     try:
         os.makedirs(the_path)
         with open(the_file, "wb") as fd:
             fd.write("1234")
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                "z", self.lg)
         assert gdf._obj == "z"
         assert gdf.data_file == the_file
         assert not gdf._is_dir
         gdf.data_file = gdf.data_file + ".dne"
         try:
             gdf.get_data_file_size()
         except DiskFileNotExist:
             pass
         else:
             self.fail("Expected DiskFileNotExist exception")
     finally:
         shutil.rmtree(td)
Esempio n. 24
0
    def test_filter_metadata(self):
        assert not os.path.exists("/tmp/foo")
        gdf = DiskFile("/tmp/foo", "vol0", "p57", "ufo47", "bar",
                               "z", self.lg)
        assert gdf.metadata == {}
        gdf._filter_metadata()
        assert gdf.metadata == {}

        gdf.metadata[X_TYPE] = 'a'
        gdf.metadata[X_OBJECT_TYPE] = 'b'
        gdf.metadata['foobar'] = 'c'
        gdf._filter_metadata()
        assert X_TYPE not in gdf.metadata
        assert X_OBJECT_TYPE not in gdf.metadata
        assert 'foobar' in gdf.metadata
Esempio n. 25
0
    def test_unlinkold_file_unlink_error(self):
        td = tempfile.mkdtemp()
        the_path = os.path.join(td, "vol0", "bar")
        the_file = os.path.join(the_path, "z")
        try:
            os.makedirs(the_path)
            with open(the_file, "wb") as fd:
                fd.write("1234")
            gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                   "z", self.lg)
            assert gdf._obj == "z"
            assert gdf.data_file == the_file
            assert not gdf._is_dir

            later = float(gdf.metadata['X-Timestamp']) + 1

            def _mock_os_unlink_eacces_err(f):
                raise OSError(errno.EACCES, os.strerror(errno.EACCES))

            stats = os.stat(the_path)
            try:
                os.chmod(the_path, stats.st_mode & (~stat.S_IWUSR))

                # Handle the case os_unlink() raises an OSError
                with patch("os.unlink", _mock_os_unlink_eacces_err):
                    try:
                        gdf.unlinkold(normalize_timestamp(later))
                    except OSError as e:
                        assert e.errno == errno.EACCES
                    else:
                        self.fail("Excepted an OSError when unlinking file")
            finally:
                os.chmod(the_path, stats.st_mode)

            assert os.path.isdir(gdf.datadir)
            assert os.path.exists(os.path.join(gdf.datadir, gdf._obj))
        finally:
            shutil.rmtree(td)
Esempio n. 26
0
 def test_put_w_marker_dir_create(self):
     td = tempfile.mkdtemp()
     the_cont = os.path.join(td, "vol0", "bar")
     the_dir = os.path.join(the_cont, "dir")
     try:
         os.makedirs(the_cont)
         gdf = DiskFile(td, "vol0", "p57", "ufo47", "bar",
                                "dir", self.lg)
         assert gdf.metadata == {}
         newmd = {
             'ETag': 'etag',
             'X-Timestamp': 'ts',
             'Content-Type': 'application/directory'}
         with gdf.writer() as dw:
             dw.put(newmd, extension='.dir')
         assert gdf.data_file == the_dir
         for key,val in newmd.items():
             assert gdf.metadata[key] == val
             assert _metadata[the_dir][key] == val
         assert gdf.metadata[X_OBJECT_TYPE] == DIR_OBJECT
         assert _metadata[the_dir][X_OBJECT_TYPE] == DIR_OBJECT
     finally:
         shutil.rmtree(td)
Esempio n. 27
0
 def test_is_deleted(self):
     assert not os.path.exists("/tmp/foo")
     gdf = DiskFile("/tmp/foo", "vol0", "p57", "ufo47", "bar", "z", self.lg)
     assert gdf.is_deleted()
     gdf.data_file = "/tmp/foo/bar"
     assert not gdf.is_deleted()