diff options
-rw-r--r-- | gluster/gfapi/api.py | 6 | ||||
-rw-r--r-- | gluster/gfapi/gfapi.py | 17 | ||||
-rw-r--r-- | test/functional/libgfapi-python-tests.py | 7 | ||||
-rw-r--r-- | test/unit/gluster/test_gfapi.py | 14 |
4 files changed, 44 insertions, 0 deletions
diff --git a/gluster/gfapi/api.py b/gluster/gfapi/api.py index 971e98c..e4f0b14 100644 --- a/gluster/gfapi/api.py +++ b/gluster/gfapi/api.py @@ -515,3 +515,9 @@ glfs_get_volumeid = gfapi_prototype('glfs_get_volumeid', ctypes.c_int, ctypes.c_void_p, ctypes.c_char_p, ctypes.c_size_t) + +glfs_mknod = gfapi_prototype('glfs_mknod', ctypes.c_int, + ctypes.c_void_p, + ctypes.c_char_p, + ctypes.c_uint32, + ctypes.c_uint32) diff --git a/gluster/gfapi/gfapi.py b/gluster/gfapi/gfapi.py index 5078c00..ee1fd36 100644 --- a/gluster/gfapi/gfapi.py +++ b/gluster/gfapi/gfapi.py @@ -1823,3 +1823,20 @@ class Volume(object): if errors: raise Error(errors) + + @validate_mount + def mknod(self, path, mode, dev): + """ + Create special or ordinary file; see mknod(2) for more details. + + :param path: Path of file to be created. + :param mode: Operation to be performed on the given range + :param dev: Major and minor numbers for newly created device special + file; use os.makedev to build value. Ignored for other + types. + :raises: OSError on failure + """ + ret = api.glfs_mknod(self.fs, decode_to_bytes(path), mode, dev) + if ret < 0: + err = ctypes.get_errno() + raise OSError(err, os.strerror(err)) diff --git a/test/functional/libgfapi-python-tests.py b/test/functional/libgfapi-python-tests.py index be2801f..a699d8c 100644 --- a/test/functional/libgfapi-python-tests.py +++ b/test/functional/libgfapi-python-tests.py @@ -815,6 +815,13 @@ class FileOpsTest(unittest.TestCase): self.assertEqual(src_stat.st_mode, dest_stat.st_mode) self.assertEqual(src_stat.st_mtime, dest_stat.st_mtime) + def test_mknod(self): + self.vol.mknod("dev", stat.S_IFCHR | 0o644, os.makedev(1, 3)) + st = self.vol.stat("dev") + self.assertTrue(stat.S_ISCHR(st.st_mode)) + self.assertEqual(os.major(st.st_rdev), 1) + self.assertEqual(os.minor(st.st_rdev), 3) + class DirOpsTest(unittest.TestCase): diff --git a/test/unit/gluster/test_gfapi.py b/test/unit/gluster/test_gfapi.py index d35d7e1..a8c0035 100644 --- a/test/unit/gluster/test_gfapi.py +++ b/test/unit/gluster/test_gfapi.py @@ -1188,3 +1188,17 @@ class TestVolume(unittest.TestCase): int(mtime)) self.assertEqual(mock_glfs_utimens.call_args[0][2][1].tv_nsec, int(math.modf(mtime)[0] * 1e9)) + + def test_mknod_success(self): + mock_glfs_mknod = Mock() + mock_glfs_mknod.return_value = 0 + + with patch("gluster.gfapi.api.glfs_mknod", mock_glfs_mknod): + self.vol.mknod("testdev", 0o644, os.makedev(1, 3)) + + def test_mknod_fail_exception(self): + mock_glfs_mknod = Mock() + mock_glfs_mknod.return_value = -1 + + with patch("gluster.gfapi.api.glfs_mknod", mock_glfs_mknod): + self.assertRaises(OSError, self.vol.mknod, "testdev", 0o644, 0) |