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>
This commit is contained in:
Niels de Vos 2013-09-30 09:05:14 +02:00 committed by Anand Avati
parent a66bf67965
commit c499ef86a2
7 changed files with 80 additions and 22 deletions

22
.gitignore vendored
View File

@ -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

View File

@ -1 +1 @@
SUBDIRS = src
SUBDIRS = src examples

View File

@ -1,4 +1,6 @@
noinst_PROGRAMS = glfsxmp
EXTRA_PROGRAMS = glfsxmp
glfsxmp_SOURCES = glfsxmp.c
glfsxmp_CFLAGS = $(GLFS_CFLAGS) -Wall
glfsxmp_LDADD = $(GLFS_LIBS)
glfsxmp_LDADD = $(GLFS_LIBS)
EXTRA_DIST = gfapi.py

View File

@ -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 = (

29
api/examples/setup.py.in Normal file
View File

@ -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']
)

View File

@ -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

View File

@ -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.