summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xglusterfs/api.py6
-rwxr-xr-xglusterfs/gfapi.py16
-rw-r--r--test/unit/gluster/test_gfapi.py30
3 files changed, 50 insertions, 2 deletions
diff --git a/glusterfs/api.py b/glusterfs/api.py
index 1ecc34a..7848448 100755
--- a/glusterfs/api.py
+++ b/glusterfs/api.py
@@ -232,6 +232,12 @@ glfs_rmdir = ctypes.CFUNCTYPE(ctypes.c_int,
ctypes.c_void_p,
ctypes.c_char_p)(('glfs_rmdir', client))
+glfs_setfsuid = ctypes.CFUNCTYPE(ctypes.c_int,
+ ctypes.c_uint)(('glfs_setfsuid', client))
+
+glfs_setfsgid = ctypes.CFUNCTYPE(ctypes.c_int,
+ ctypes.c_uint)(('glfs_setfsgid', client))
+
# TODO: creat and open fails on test_create_file_already_exists & test_open_file_not_exist functional testing, # noqa
# when defined via function prototype.. Need to find RCA. For time being, using it from 'api.glfs_' # noqa
diff --git a/glusterfs/gfapi.py b/glusterfs/gfapi.py
index af25d18..42c4aef 100755
--- a/glusterfs/gfapi.py
+++ b/glusterfs/gfapi.py
@@ -205,8 +205,6 @@ class Dir(object):
class Volume(object):
- # Housekeeping functions.
-
def __init__(self, host, volid, proto="tcp", port=24007):
# Add a reference so the module-level variable "api" doesn't
# get yanked out from under us (see comment above File def'n).
@@ -483,6 +481,20 @@ class Volume(object):
except OSError as e:
onerror(self.rmdir, path, e)
+ def setfsuid(self, uid):
+ ret = api.glfs_setfsuid(uid)
+ if ret < 0:
+ err = ctypes.get_errno()
+ raise OSError(err, os.strerror(err))
+ return ret
+
+ def setfsgid(self, gid):
+ ret = api.glfs_setfsgid(gid)
+ if ret < 0:
+ err = ctypes.get_errno()
+ raise OSError(err, os.strerror(err))
+ return ret
+
def setxattr(self, path, key, value, vlen):
ret = api.glfs_setxattr(self.fs, path, key, value, vlen, 0)
if ret < 0:
diff --git a/test/unit/gluster/test_gfapi.py b/test/unit/gluster/test_gfapi.py
index 0d73a32..8451b51 100644
--- a/test/unit/gluster/test_gfapi.py
+++ b/test/unit/gluster/test_gfapi.py
@@ -803,6 +803,36 @@ class TestVolume(unittest.TestCase):
mock_unlink.assert_called_once_with("dir1/file")
mock_rmdir.assert_called_with("dir1")
+ def test_setfsuid_success(self):
+ mock_glfs_setfsuid = Mock()
+ mock_glfs_setfsuid.return_value = 0
+
+ with patch("glusterfs.gfapi.api.glfs_setfsuid", mock_glfs_setfsuid):
+ ret = self.vol.setfsuid(1000)
+ self.assertEquals(ret, 0)
+
+ def test_setfsuid_fail(self):
+ mock_glfs_setfsuid = Mock()
+ mock_glfs_setfsuid.return_value = -1
+
+ with patch("glusterfs.gfapi.api.glfs_setfsuid", mock_glfs_setfsuid):
+ self.assertRaises(OSError, self.vol.setfsuid, 1001)
+
+ def test_setfsgid_success(self):
+ mock_glfs_setfsgid = Mock()
+ mock_glfs_setfsgid.return_value = 0
+
+ with patch("glusterfs.gfapi.api.glfs_setfsgid", mock_glfs_setfsgid):
+ ret = self.vol.setfsgid(1000)
+ self.assertEquals(ret, 0)
+
+ def test_setfsgid_fail(self):
+ mock_glfs_setfsgid = Mock()
+ mock_glfs_setfsgid.return_value = -1
+
+ with patch("glusterfs.gfapi.api.glfs_setfsgid", mock_glfs_setfsgid):
+ self.assertRaises(OSError, self.vol.setfsgid, 1001)
+
def test_setxattr_success(self):
mock_glfs_setxattr = Mock()
mock_glfs_setxattr.return_value = 0