From 0088e318c1218191535ea0baa04b4fe858412f54 Mon Sep 17 00:00:00 2001 From: Meghana M Date: Mon, 24 Mar 2014 13:58:38 +0530 Subject: 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 Reviewed-on: http://review.gluster.org/7321 Reviewed-by: Raghavendra Talur Reviewed-by: Santosh Pradhan Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- configure.ac | 3 + extras/hook-scripts/Makefile.am | 2 +- extras/hook-scripts/reset/Makefile.am | 2 + extras/hook-scripts/reset/post/Makefile.am | 1 + extras/hook-scripts/reset/post/S31ganesha-reset.sh | 38 ++++ extras/hook-scripts/reset/pre/Makefile.am | 1 + extras/hook-scripts/set/post/Makefile.am | 2 +- extras/hook-scripts/set/post/S31ganesha-set.sh | 247 +++++++++++++++++++++ glusterfs.spec.in | 6 + xlators/mgmt/glusterd/src/glusterd-hooks.c | 9 +- xlators/mgmt/glusterd/src/glusterd-volgen.c | 28 +++ xlators/mgmt/glusterd/src/glusterd-volume-set.c | 10 + xlators/nfs/server/src/nfs.c | 10 + 13 files changed, 356 insertions(+), 3 deletions(-) create mode 100644 extras/hook-scripts/reset/Makefile.am create mode 100644 extras/hook-scripts/reset/post/Makefile.am create mode 100755 extras/hook-scripts/reset/post/S31ganesha-reset.sh create mode 100644 extras/hook-scripts/reset/pre/Makefile.am create mode 100755 extras/hook-scripts/set/post/S31ganesha-set.sh diff --git a/configure.ac b/configure.ac index ae0bc78c4b5..e032e8f311c 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/extras/hook-scripts/Makefile.am b/extras/hook-scripts/Makefile.am index dd67c248e1a..4a1adb3d5db 100644 --- a/extras/hook-scripts/Makefile.am +++ b/extras/hook-scripts/Makefile.am @@ -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 diff --git a/extras/hook-scripts/reset/Makefile.am b/extras/hook-scripts/reset/Makefile.am new file mode 100644 index 00000000000..6e2701e909e --- /dev/null +++ b/extras/hook-scripts/reset/Makefile.am @@ -0,0 +1,2 @@ +SUBDIRS = post pre +CLEANFILES = diff --git a/extras/hook-scripts/reset/post/Makefile.am b/extras/hook-scripts/reset/post/Makefile.am new file mode 100644 index 00000000000..fcdd8ab55ba --- /dev/null +++ b/extras/hook-scripts/reset/post/Makefile.am @@ -0,0 +1 @@ +EXTRA_DIST = S31ganesha-reset.sh diff --git a/extras/hook-scripts/reset/post/S31ganesha-reset.sh b/extras/hook-scripts/reset/post/S31ganesha-reset.sh new file mode 100755 index 00000000000..68411e4bd95 --- /dev/null +++ b/extras/hook-scripts/reset/post/S31ganesha-reset.sh @@ -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 + + + diff --git a/extras/hook-scripts/reset/pre/Makefile.am b/extras/hook-scripts/reset/pre/Makefile.am new file mode 100644 index 00000000000..1b336ac1a85 --- /dev/null +++ b/extras/hook-scripts/reset/pre/Makefile.am @@ -0,0 +1 @@ +EXTRA_DIST = diff --git a/extras/hook-scripts/set/post/Makefile.am b/extras/hook-scripts/set/post/Makefile.am index 9ded234cf9b..3ec25d94134 100644 --- a/extras/hook-scripts/set/post/Makefile.am +++ b/extras/hook-scripts/set/post/Makefile.am @@ -1 +1 @@ -EXTRA_DIST = S30samba-set.sh +EXTRA_DIST = S30samba-set.sh S31ganesha-set.sh diff --git a/extras/hook-scripts/set/post/S31ganesha-set.sh b/extras/hook-scripts/set/post/S31ganesha-set.sh new file mode 100755 index 00000000000..3b74c766b7d --- /dev/null +++ b/extras/hook-scripts/set/post/S31ganesha-set.sh @@ -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 + + diff --git a/glusterfs.spec.in b/glusterfs.spec.in index 43bbc97617e..755c9fd8478 100644 --- a/glusterfs.spec.in +++ b/glusterfs.spec.in @@ -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 diff --git a/xlators/mgmt/glusterd/src/glusterd-hooks.c b/xlators/mgmt/glusterd/src/glusterd-hooks.c index 78730a5645f..a845f540afa 100644 --- a/xlators/mgmt/glusterd/src/glusterd-hooks.c +++ b/xlators/mgmt/glusterd/src/glusterd-hooks.c @@ -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; diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index ecc8f7cafe6..82ff8826843 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -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); diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index 8998d8478d0..b8eb8a56582 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -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", diff --git a/xlators/nfs/server/src/nfs.c b/xlators/nfs/server/src/nfs.c index 918e8631255..65814ebc17c 100644 --- a/xlators/nfs/server/src/nfs.c +++ b/xlators/nfs/server/src/nfs.c @@ -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, -- cgit