cli/hooks : Add volume set options to enable/disable nfs-ganesha support.

1. gluster volume set nfs-ganesha.enable ON/OFF
If the option is set to ON, the volume field in the nfs-ganesha configuartion file is
edited. Gluster-nfs is disabled on that volume and the volume is exported using
nfs-ganesha.

2.gluster volume set nfs-ganesha.host IP
This is used to provide the IP of the nfs-ganesha host.

Note : nfs-ganesha.host MUST be set before using nfs-ganesha.enable ON

The switch from gluster-nfs to nfs-ganesha is mostly done by the hook-scripts
in the post phase of the 'set' option. As a result, gluster volume reset does not
function as it is expected to. By default, nfs-ganesha will be set to off but the
process  will not be killed.

Hence, a few changes have to be made post 'reset' option as well. Those changes
also have been added.

Change-Id: I7fdc14ee49d1724af96eda33c6a3ec08b1020788
BUG: 1092283
Signed-off-by: Meghana <mmadhusu@redhat.com>
Reviewed-on: http://review.gluster.org/7321
Reviewed-by: Raghavendra Talur <rtalur@redhat.com>
Reviewed-by: Santosh Pradhan <spradhan@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
Meghana M 2014-03-24 13:58:38 +05:30 committed by Vijay Bellur
parent 66f560e007
commit 0088e318c1
13 changed files with 356 additions and 3 deletions

View File

@ -183,6 +183,9 @@ AC_CONFIG_FILES([Makefile
extras/hook-scripts/set/post/Makefile
extras/hook-scripts/stop/Makefile
extras/hook-scripts/stop/pre/Makefile
extras/hook-scripts/reset/Makefile
extras/hook-scripts/reset/post/Makefile
extras/hook-scripts/reset/pre/Makefile
contrib/fuse-util/Makefile
contrib/uuid/uuid_types.h
glusterfs-api.pc

View File

@ -1,2 +1,2 @@
EXTRA_DIST = S40ufo-stop.py S56glusterd-geo-rep-create-post.sh
SUBDIRS = add-brick set start stop
SUBDIRS = add-brick set start stop reset

View File

@ -0,0 +1,2 @@
SUBDIRS = post pre
CLEANFILES =

View File

@ -0,0 +1 @@
EXTRA_DIST = S31ganesha-reset.sh

View File

@ -0,0 +1,38 @@
#/bin/bash
PROGNAME="Sganesha-reset"
OPTSPEC="volname:"
VOL=
function parse_args () {
ARGS=$(getopt -l $OPTSPEC -o "o" -name $PROGNAME $@)
eval set -- "$ARGS"
case $1 in
--volname)
shift
VOL=$1
;;
esac
}
function is_volume_started () {
volname=$1
echo "$(grep status /var/lib/glusterd/vols/"$volname"/info |\
cut -d"=" -f2)"
}
parse_args $@
if ps aux | grep -q "[g]anesha.nfsd"
then
kill -s TERM `cat /var/run/ganesha.pid`
sleep 10
rm -rf /var/lib/ganesha/exports
rm -rf /var/lib/ganesha/export_added
sed -i /conf/d /var/lib/ganesha/nfs-ganesha.conf
if [ "1" = $(is_volume_started "$VOL") ];
then
gluster volume start $VOL force
fi
fi

View File

@ -0,0 +1 @@
EXTRA_DIST =

View File

@ -1 +1 @@
EXTRA_DIST = S30samba-set.sh
EXTRA_DIST = S30samba-set.sh S31ganesha-set.sh

View File

@ -0,0 +1,247 @@
#!/bin/bash
PROGNAME="Sganesha-set"
OPTSPEC="volname:"
VOL=
declare -i EXPORT_ID
CONF1="/var/lib/ganesha/nfs-ganesha.conf"
LOG="/tmp/ganesha.log"
gnfs="enabled"
enable_ganesha=""
host_name="none"
IS_HOST_SET="NO"
LOC=""
function parse_args ()
{
ARGS=$(getopt -l $OPTSPEC -o "o" -name $PROGNAME $@)
eval set -- "$ARGS"
while true; do
case $1 in
--volname)
shift
VOL=$1
;;
*)
shift
for pair in $@; do
read key value < <(echo "$pair" | tr "=" " ")
case "$key" in
"nfs-ganesha.enable")
enable_ganesha=$value
;;
"nfs-ganesha.host")
host_name=$value
;;
*)
;;
esac
done
shift
break
;;
esac
shift
done
}
function check_if_host_set()
{
if cat /var/lib/glusterd/vols/$VOL/info | grep -q "nfs-ganesha.host"
then
IS_HOST_SET="YES"
fi
}
function check_nfsd_loc()
{
if ls /usr/bin | grep "[g]anesha.nfsd"
then
LOC="/usr"
else
LOC="/usr/local"
fi
}
function check_gluster_nfs()
{
if cat /var/lib/glusterd/vols/$VOL/info | grep -q "nfs.disable=ON"
then
gnfs="disabled"
fi
}
#This function generates a new export entry as export.volume_name.conf
function write_conf()
{
echo "EXPORT{
"
echo "Export_Id = ;"
echo "Path=\"/$1\";"
echo "FSAL {
"
echo "name = "GLUSTER";"
echo "hostname=\"$2\";"
echo "volume=\"$1\";"
echo "}"
echo "Access_type = RW;"
echo "Squash = No_root_squash;"
echo "Pseudo=\"/$1\";"
echo "NFS_Protocols = \"3,4\" ;"
echo "Transport_Protocols = \"UDP,TCP\" ;"
echo "SecType = \"sys\";"
echo "Tag = \"$1\";"
echo "}"
}
#This function keeps track of export IDs and increments it with every new entry
function export_add()
{
count=`ls -l /var/lib/ganesha/exports/*.conf | wc -l`
if [ "$count" = "1" ] ;
then
EXPORT_ID=1
else
#if [ -s /var/lib/ganesha/export_removed ];
# then
# EXPORT_ID=`head -1 /var/lib/ganesha/export_removed`
# sed -i -e "1d" /var/lib/ganesha/export_removed
# else
EXPORT_ID=`cat /var/lib/ganesha/export_added`
EXPORT_ID=EXPORT_ID+1
#fi
fi
echo $EXPORT_ID > /var/lib/ganesha/export_added
sed -i s/Export_Id.*/"Export_Id = $EXPORT_ID;"/ \
/var/lib/ganesha/exports/export.$VOL.conf
echo "%include \"/var/lib/ganesha/exports/export.$VOL.conf\"" >> $CONF1
}
function export_remove()
{
$removed_id=`cat /var/lib/ganesha/exports/export.$VOL.conf | grep Export_Id | cut -d " " -f3`
echo $removed_id >> /var/lib/ganesha/export_removed
}
function start_ganesha()
{
if [ "$IS_HOST_SET" = "NO" ]
then
gluster volume set $VOL nfs-ganesha.enable OFF
else
check_gluster_nfs
#Remove export entry from nfs-ganesha.conf
sed -i /$VOL.conf/d $CONF1
pkill ganesha.nfsd
sleep 10
gluster volume set $VOL nfs.disable ON
sleep 4
#Create a new export entry
export_add
if ls /usr/bin/ | grep -q "ganesha.nfsd"
then
sed -i s/FSAL_Shared.*/FSAL_Shared_Library=\
"\"\/usr\/lib64\/ganesha\/libfsalgluster.so\";"/ $CONF1
/usr/bin/ganesha.nfsd -f $CONF1 -L $LOG -N NIV_FULL_DEBUG -d
sleep 2
else
sed -i s/FSAL_Shared.*/FSAL_Shared_Library=\
"\"\/usr\/local\/lib64\/ganesha\/libfsalgluster.so\";"/ $CONF1
/usr/local/bin/ganesha.nfsd -f $CONF1 -L $LOG -N NIV_FULL_DEBUG -d
sleep 2
fi
if ! ps aux | grep -q "[g]anesha.nfsd"
then
if [ "$gnfs" = "enabled" ]
then
gluster volume set $VOL nfs.disable OFF
fi
rm -rf /var/lib/ganesha/exports/*
rm -rf /var/lib/ganesha/export_added
gluster volume set $VOL nfs-ganesha.enable OFF
gluster volume set $VOL nfs-ganesha.host none
exit 1
fi
fi
}
#This function generates a new config file when ganesha.host is set
#If the volume is already exported, only hostname is changed
function set_hostname()
{
if ! ls /var/lib/ganesha/exports/ | grep -q $VOL.conf
then
write_conf $VOL $host_name >\
/var/lib/ganesha/exports/export.$VOL.conf
else
sed -i s/hostname.*/"hostname=\
\"$host_name\";"/ /var/lib/ganesha/exports/export.$VOL.conf
fi
}
function stop_ganesha()
{
if ps aux | grep -q "[g]anesha.nfsd"
then
pkill ganesha.nfsd
sleep 10
fi
gluster vol set $VOL nfs-ganesha.host none
#Remove the specfic export configuration file
rm -rf /var/lib/ganesha/exports/export.$VOL.conf
#Remove that entry from nfs-ganesha.conf
sed -i /$VOL.conf/d $CONF1
#If there are any other volumes exported, restart nfs-ganesha
if [ "$(ls -A /var/lib/ganesha/exports)" ];
then
check_nfsd_loc
$LOC/bin/ganesha.nfsd -f $CONF1 -L $LOG -N NIV_FULL_DEBUG -d
else
rm -rf /var/lib/ganesha/export_added
fi
}
parse_args $@
if [ ! -d "/var/lib/ganesha/exports" ];
then
mkdir /var/lib/ganesha/exports
fi
if echo $enable_ganesha | grep -q -i "ON"
then
check_if_host_set $VOL
start_ganesha
elif echo $enable_ganesha | grep -q -i "OFF"
then
check_if_host_set
if [ "$IS_HOST_SET" = "YES" ]
then
stop_ganesha
fi
fi
if [ "$host_name" != "none" ];
then
check_if_host_set
set_hostname
if cat /var/lib/glusterd/vols/$VOL/info\
| grep -i -q "nfs-ganesha.enable=on"
then
start_ganesha
fi
fi

View File

@ -649,6 +649,9 @@ mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/stop/pre
mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/start
mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/start/post
mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/start/pre
mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/reset
mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/reset/post
mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/reset/pre
mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/remove-brick
mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/remove-brick/post
mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/remove-brick/pre
@ -691,6 +694,9 @@ install -p -m 0744 extras/hook-scripts/S56glusterd-geo-rep-create-post.sh \
%{buildroot}%{_sharedstatedir}/glusterd/hooks/1/add-brick/post
%{__install} -p -m 0744 extras/hook-scripts/add-brick/pre/*.sh \
%{buildroot}%{_sharedstatedir}/glusterd/hooks/1/add-brick/pre
%{__install} -p -m 0744 extras/hook-scripts/reset/post/*.sh \
%{buildroot}%{_sharedstatedir}/glusterd/hooks/1/reset/post
find ./tests ./run-tests.sh -type f | cpio -pd %{buildroot}%{_prefix}/share/glusterfs

View File

@ -46,7 +46,7 @@ char glusterd_hook_dirnames[GD_OP_MAX][256] =
[GD_OP_REMOVE_BRICK] = "remove-brick",
[GD_OP_REPLACE_BRICK] = EMPTY,
[GD_OP_SET_VOLUME] = "set",
[GD_OP_RESET_VOLUME] = EMPTY,
[GD_OP_RESET_VOLUME] = "reset",
[GD_OP_SYNC_VOLUME] = EMPTY,
[GD_OP_LOG_ROTATE] = EMPTY,
[GD_OP_GSYNC_CREATE] = "gsync-create",
@ -277,6 +277,13 @@ glusterd_hooks_add_op_args (runner_t *runner, glusterd_op_t op,
glusterd_hooks_add_hooks_version (runner);
glusterd_hooks_add_op (runner, "add-brick");
glusterd_hooks_add_working_dir (runner, priv);
break;
case GD_OP_RESET_VOLUME:
glusterd_hooks_add_hooks_version (runner);
glusterd_hooks_add_op (runner, "reset");
glusterd_hooks_add_working_dir (runner, priv);
break;
default:
break;

View File

@ -3057,6 +3057,34 @@ nfs_option_handler (volgen_graph_t *graph,
return -1;
}
if (! strcmp (vme->option, "!nfs-ganesha.enable")) {
ret = gf_asprintf (&aa, "nfs-ganesha.%s.enable",
volinfo->volname);
if (ret != -1) {
ret = xlator_set_option (xl, aa, vme->value);
GF_FREE (aa);
}
if (ret)
return -1;
}
if (! strcmp (vme->option, "!nfs-ganesha.host")) {
ret = gf_asprintf (&aa, "nfs-ganesha.%s.host",
volinfo->volname);
if (ret != -1) {
ret = xlator_set_option (xl, aa, vme->value);
GF_FREE (aa);
}
if (ret)
return -1;
}
if ( (strcmp (vme->voltype, "nfs/server") == 0) &&
(vme->option && vme->option[0]!='!') ) {
ret = xlator_set_option (xl, vme->option, vme->value);

View File

@ -1392,6 +1392,16 @@ struct volopt_map_entry glusterd_volopt_map[] = {
.option = "!nfs-disable",
.op_version = 1
},
{ .key = "nfs-ganesha.enable",
.voltype = "nfs/server",
.option = "!nfs-ganesha.enable",
.op_version = 4
},
{ .key = "nfs-ganesha.host",
.voltype = "nfs/server",
.option = "!nfs-ganesha.host",
.op_version = 4
},
{ .key = "nfs.nlm",
.voltype = "nfs/server",
.option = "nfs.nlm",

View File

@ -1827,6 +1827,16 @@ struct volume_options options[] = {
.description = "This option is used to start or stop the NFS server "
"for individual volumes."
},
{ .key = {"nfs-ganesha.*.host"},
.type = GF_OPTION_TYPE_INTERNET_ADDRESS_LIST,
.default_value = "none",
.description = "Set nfs-ganesha host IP"
},
{ .key = {"nfs-ganesha.*.enable"},
.type = GF_OPTION_TYPE_BOOL,
.default_value = "off",
.description = "This option, if set to 'on', enables exports via nfs-ganesha "
},
{ .key = {"nfs.nlm"},
.type = GF_OPTION_TYPE_BOOL,