Aravinda VK has uploaded a new change for review.
Change subject: gluster: [WIP]Get size information of gluster volume ......................................................................
gluster: [WIP]Get size information of gluster volume
Change-Id: I358d4f3bf793ecc1a01e0592d68919d1405f6e19 Signed-off-by: Aravinda VK avishwan@redhat.com --- M client/vdsClientGluster.py M vdsm.spec.in M vdsm/gluster/Makefile.am M vdsm/gluster/__init__.py M vdsm/gluster/api.py A vdsm/gluster/gfapi.py 6 files changed, 100 insertions(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/22/17822/1
diff --git a/client/vdsClientGluster.py b/client/vdsClientGluster.py index 90af83e..644bfe3 100644 --- a/client/vdsClientGluster.py +++ b/client/vdsClientGluster.py @@ -424,6 +424,17 @@ pp.pprint(status) return status['status']['code'], status['status']['message']
+ def do_glusterVolumeSize(self, args): + params = self._eqSplit(args) + try: + volumeName = params.get('volumeName', '') + except: + raise ValueError + + status = self.s.glusterVolumeSize(volumeName) + pp.pprint(status) + return status['status']['code'], status['status']['message'] +
def getGlusterCmdDict(serv): return \ @@ -705,4 +716,9 @@ 'not set' '(swift, glusterd, smb, memcached)' )), + 'glusterVolumeSize': ( + serv.do_glusterVolumeSize, + ('volumeName=<volume name>', + 'Returns total, available and used space status of gluster volume' + )), } diff --git a/vdsm.spec.in b/vdsm.spec.in index 21b3565..e49e102 100644 --- a/vdsm.spec.in +++ b/vdsm.spec.in @@ -1271,6 +1271,7 @@ %doc COPYING %{_datadir}/%{vdsm_name}/gluster/api.py* %{_datadir}/%{vdsm_name}/gluster/vdsmapi-gluster-schema.json +%{_datadir}/%{vdsm_name}/gluster/gfapi.py* %{_datadir}/%{vdsm_name}/gluster/hooks.py* %{_datadir}/%{vdsm_name}/gluster/services.py* %endif diff --git a/vdsm/gluster/Makefile.am b/vdsm/gluster/Makefile.am index dd5434d..9c2989f 100644 --- a/vdsm/gluster/Makefile.am +++ b/vdsm/gluster/Makefile.am @@ -26,6 +26,7 @@ api.py \ cli.py \ exception.py \ + gfapi.py \ hooks.py \ hostname.py \ services.py \ diff --git a/vdsm/gluster/__init__.py b/vdsm/gluster/__init__.py index bec70ea..e5a2fd6 100644 --- a/vdsm/gluster/__init__.py +++ b/vdsm/gluster/__init__.py @@ -22,7 +22,7 @@ import tempfile from functools import wraps
-MODULE_LIST = ('cli', 'hooks', 'services') +MODULE_LIST = ('cli', 'hooks', 'services', 'gfapi')
def makePublic(func): diff --git a/vdsm/gluster/api.py b/vdsm/gluster/api.py index 4bd8308..89546c1 100644 --- a/vdsm/gluster/api.py +++ b/vdsm/gluster/api.py @@ -287,6 +287,22 @@ status = self.svdsmProxy.glusterServicesGet(serviceNames) return {'services': status}
+ @exportAsVerb + def volumeSize(self, volumeName, options=None): + data = self.svdsmProxy.glusterVolumeStatvfs(volumeName) + # f_blocks = Total number of blocks + # f_bfree = Total number of blocks free + # f_bavail = Total number of blocks available for non root user + # total blocks available = f_blocks - (f_bfree - f_bavail) + total_blocks_available = data['f_blocks'] - \ + (data['f_bfree'] - data['f_bavail']) + return { + 'total': total_blocks_available * data.f_bsize / 1024, + 'free': data['f_bavail'] * data['f_bsize'] / 1024, + 'used': (total_blocks_available - data['f_bavail']) * \ + data['f_bsize'] / 1024 + } +
def getGlusterMethods(gluster): l = [] diff --git a/vdsm/gluster/gfapi.py b/vdsm/gluster/gfapi.py new file mode 100644 index 0000000..abfdabd --- /dev/null +++ b/vdsm/gluster/gfapi.py @@ -0,0 +1,65 @@ +# +# Copyright 2013 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Refer to the README and COPYING files for full details of the license +# +from ctypes import * + +# import exception as ge +from . import makePublic + +GLUSTER_VOL_PROTOCAL='tcp' +GLUSTER_VOL_HOST='localhost' +GLUSTER_VOL_PORT=24007 + +class Stat (Structure): + _fields_ = [ + ('f_bsize', c_ulong), + ('f_frsize', c_ulong), + ('f_blocks', c_ulong), + ('f_bfree', c_ulong), + ('f_bavail', c_ulong), + ('f_files', c_ulong), + ('f_ffree', c_ulong), + ('f_favail', c_ulong), + ('f_fsid', c_ulong), + ('f_flag', c_ulong), + ('f_namemax', c_ulong), + ('__f_spare', c_int * 6), + ] + + +api = CDLL("libgfapi.so",RTLD_GLOBAL) +api.glfs_statvfs.restype = c_int +api.glfs_statvfs.argtypes = [c_void_p, c_char_p, POINTER(Stat)] + +@makePublic +def volumeStatvfs(volumeId): + path = "/" + fs = api.glfs_new(volumeId) + api.glfs_set_volfile_server(fs, + GLUSTER_VOL_PROTOCAL, + GLUSTER_VOL_HOST, + GLUSTER_VOL_PORT) + api.glfs_init(fs) + + x = Stat() + rc = api.glfs_statvfs(fs, path, byref(x)) + statvfsData = {} + for k in x._fields_: + statvfsData[k[0]] = getattr(x, k[0]) + return statvfsData