diff options
author | Niels de Vos <ndevos@redhat.com> | 2013-09-30 09:05:14 +0200 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2013-10-02 13:04:03 -0700 |
commit | c499ef86a2dfd4e7727ce876b6cf18ba79c94fe5 (patch) | |
tree | cfe2a3ec9a71a8901f5e482a179caec56020a056 | |
parent | a66bf67965dddd9decd9210c3a530fdc85b6430c (diff) |
gfapi.py: support dynamic loading of versioned libraries
Currently gfapi.py only loads libraries by filename ending in ".so". On
an installed system without development packages, the <lib>.so filenames
are not available. ctypes.util.find_library() can be used to detect the
files dynamically.
In addition to this, also fixing some minor indention errors and package
the library into the Python site-packages path. Python applications and
libraries can now access libgfapi through 'from glusterfs import gfapi'.
Change-Id: I71e38dabd3ade5dcf24813bf2fc25cda91b571c6
BUG: 1005146
Signed-off-by: Niels de Vos <ndevos@redhat.com>
Reviewed-on: http://review.gluster.org/5835
Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
-rw-r--r-- | .gitignore | 22 | ||||
-rw-r--r-- | api/Makefile.am | 2 | ||||
-rw-r--r-- | api/examples/Makefile.am | 6 | ||||
-rwxr-xr-x | api/examples/gfapi.py | 19 | ||||
-rw-r--r-- | api/examples/setup.py.in | 29 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | glusterfs.spec.in | 22 |
7 files changed, 80 insertions, 22 deletions
diff --git a/.gitignore b/.gitignore index 9d7614945a5..ff253c1da90 100644 --- a/.gitignore +++ b/.gitignore @@ -22,25 +22,27 @@ Makefile stamp-h1 # Generated files -ufo/.tox -ufo/test/unit/.coverage +api/examples/__init__.py* +api/examples/setup.py +argp-standalone/libargp.a contrib/uuid/uuid_types.h -extras/who-wrote-glusterfs/gitdm -extras/init.d/glusterd.plist extras/init.d/glusterd-Debian extras/init.d/glusterd-Redhat extras/init.d/glusterd-SuSE +extras/init.d/glusterd.plist extras/ocf/glusterd extras/ocf/volume -glusterfs.spec +extras/who-wrote-glusterfs/gitdm glusterfs-api.pc -libtool -xlators/mount/fuse/utils/mount.glusterfs -xlators/mount/fuse/utils/mount_glusterfs -argp-standalone/libargp.a +glusterfs.spec glusterfsd/src/glusterfsd +libgfchangelog.pc libglusterfs/src/spec.lex.c libglusterfs/src/y.tab.c libglusterfs/src/y.tab.h -libgfchangelog.pc +libtool run-tests.sh +ufo/.tox +ufo/test/unit/.coverage +xlators/mount/fuse/utils/mount.glusterfs +xlators/mount/fuse/utils/mount_glusterfs diff --git a/api/Makefile.am b/api/Makefile.am index af437a64d6d..f0ad1ee971c 100644 --- a/api/Makefile.am +++ b/api/Makefile.am @@ -1 +1 @@ -SUBDIRS = src +SUBDIRS = src examples diff --git a/api/examples/Makefile.am b/api/examples/Makefile.am index 6048bb1c8b7..cfb0d3dff84 100644 --- a/api/examples/Makefile.am +++ b/api/examples/Makefile.am @@ -1,4 +1,6 @@ -noinst_PROGRAMS = glfsxmp +EXTRA_PROGRAMS = glfsxmp glfsxmp_SOURCES = glfsxmp.c glfsxmp_CFLAGS = $(GLFS_CFLAGS) -Wall -glfsxmp_LDADD = $(GLFS_LIBS)
\ No newline at end of file +glfsxmp_LDADD = $(GLFS_LIBS) + +EXTRA_DIST = gfapi.py diff --git a/api/examples/gfapi.py b/api/examples/gfapi.py index 8d9ed732947..3ac67f4d5ba 100755 --- a/api/examples/gfapi.py +++ b/api/examples/gfapi.py @@ -1,6 +1,7 @@ #!/usr/bin/python from ctypes import * +from ctypes.util import find_library import os import sys import time @@ -8,9 +9,9 @@ import types # Looks like ctypes is having trouble with dependencies, so just force them to # load with RTLD_GLOBAL until I figure that out. -glfs = CDLL("libglusterfs.so",RTLD_GLOBAL) -xdr = CDLL("libgfxdr.so",RTLD_GLOBAL) -api = CDLL("libgfapi.so",RTLD_GLOBAL) +glfs = CDLL(find_library("glusterfs"),RTLD_GLOBAL) +xdr = CDLL(find_library("gfxdr"),RTLD_GLOBAL) +api = CDLL(find_library("gfapi"),RTLD_GLOBAL) # Wow, the Linux kernel folks really play nasty games with this structure. If # you look at the man page for stat(2) and then at this definition you'll note @@ -98,10 +99,12 @@ class File(object): def write (self, data, flags=0): return api.glfs_write(self.fd,data,len(data),flags) - def fallocate (self, mode, offset, len): - return api.glfs_fallocate(self.fd, mode, offset, len) - def discard (self, offset, len): - return api.glfs_discard(self.fd, offset, len) + def fallocate (self, mode, offset, len): + return api.glfs_fallocate(self.fd, mode, offset, len) + + def discard (self, offset, len): + return api.glfs_discard(self.fd, offset, len) + class Dir(object): @@ -381,7 +384,7 @@ if __name__ == "__main__": test_setxattr, test_getxattr, test_listxattr, - test_fallocate, + test_fallocate, ) ok_to_fail = ( diff --git a/api/examples/setup.py.in b/api/examples/setup.py.in new file mode 100644 index 00000000000..44b73809486 --- /dev/null +++ b/api/examples/setup.py.in @@ -0,0 +1,29 @@ +from distutils.core import setup + +# generate a __init__.py for the package namespace +fo = open('__init__.py', 'w') +fo.write('__version__ = "@PACKAGE_VERSION@"\n') +fo.close() + +DESC = """GlusterFS is a clustered file-system capable of scaling to +several petabytes. It aggregates various storage bricks over Infiniband +RDMA or TCP/IP interconnect into one large parallel network file system. +GlusterFS is one of the most sophisticated file systems in terms of +features and extensibility. It borrows a powerful concept called +Translators from GNU Hurd kernel. Much of the code in GlusterFS is in +user space and easily manageable. + +This package contains the Python interface to the libgfapi library.""" + +setup( + name='glusterfs-api', + version='@PACKAGE_VERSION@', + description='Python client library for the GlusterFS libgfapi', + long_description=DESC, + author='Gluster Community', + author_email='gluster-devel@nongnu.org', + license='LGPLv3', + url='http://gluster.org/', + package_dir={'gluster':''}, + packages=['gluster'] +) diff --git a/configure.ac b/configure.ac index e723dfabcf9..2ea5937ada6 100644 --- a/configure.ac +++ b/configure.ac @@ -164,6 +164,8 @@ AC_CONFIG_FILES([Makefile libgfchangelog.pc api/Makefile api/src/Makefile + api/examples/Makefile + api/examples/setup.py geo-replication/Makefile geo-replication/src/Makefile geo-replication/syncdaemon/Makefile diff --git a/glusterfs.spec.in b/glusterfs.spec.in index 96341adf9ec..8940fdc0fed 100644 --- a/glusterfs.spec.in +++ b/glusterfs.spec.in @@ -63,6 +63,12 @@ %global _with_systemd true %endif +# From https://fedoraproject.org/wiki/Packaging:Python#Macros +%if ( 0%{?rhel} && 0%{?rhel} <= 5 ) +%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")} +%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")} +%endif + Summary: Cluster File System %if ( 0%{_for_fedora_koji_builds} ) Name: glusterfs @@ -315,6 +321,8 @@ This package provides the glusterfs server daemon. Summary: Clustered file-system api library Group: System Environment/Daemons Requires: %{name} = %{version}-%{release} +# we provide the Python package/namespace 'gluster' +Provides: python-gluster = %{version}-%{release} %description api GlusterFS is a clustered file-system capable of scaling to several @@ -325,7 +333,7 @@ terms of features and extensibility. It borrows a powerful concept called Translators from GNU Hurd kernel. Much of the code in GlusterFS is in user space and easily manageable. -This package provides the glusterfs libgfapi library +This package provides the glusterfs libgfapi library. %if ( 0%{!?_without_ocf:1} ) %package resource-agents @@ -437,9 +445,17 @@ regression testing of Gluster. %{__make} %{?_smp_mflags} +pushd api/examples +FLAGS="$RPM_OPT_FLAGS" %{__python} setup.py build +popd + %install %{__rm} -rf %{buildroot} %{__make} install DESTDIR=%{buildroot} +# install the gfapi Python library in /usr/lib/python*/site-packages +pushd api/examples +%{__python} setup.py install --skip-build --verbose --root %{buildroot} +popd # Install include directory %{__mkdir_p} %{buildroot}%{_includedir}/glusterfs %{__install} -p -m 0644 libglusterfs/src/*.h \ @@ -768,6 +784,7 @@ fi %exclude %{_libdir}/*.so %{_libdir}/libgfapi.* %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount/api* +%{python_sitelib}/* %if ( 0%{!?_without_ocf:1} ) %files resource-agents @@ -858,6 +875,9 @@ if [ $1 -ge 1 ]; then fi %changelog +* Thu Sep 30 2013 Niels de Vos <ndevos@redhat.com> +- Package gfapi.py into the Python site-packages path (#1005146) + * Tue Sep 17 2013 Harshavardhana <fharshav@redhat.com> - Provide a new package called "glusterfs-regression-tests" for standalone regression testing. |