summaryrefslogtreecommitdiffstats
path: root/cli
diff options
context:
space:
mode:
authorMeghana Madhusudhan <mmadhusu@redhat.com>2015-04-17 10:56:57 +0530
committerKaleb KEITHLEY <kkeithle@redhat.com>2015-05-03 04:34:42 -0700
commitc976b59bc4c34ed26bc3f5d9b78356600d8f1d47 (patch)
tree59d7cdb03c34f7b269b861ffa0e52d32d4a1831d /cli
parent09bbd5c767c917b90a12f015ab4c943c0c210574 (diff)
NFS-Ganesha: Handling CLI commands when NFS-Ganesha keys are set
When ganesha.enable is set to on and features.ganesha is enabled, there are a few behaviour changes that should be seen in other volume operations. 1. ganesha.enable can be set to 'on' only when features.ganesha is set to 'enable' 2.When gluster vol is started, and if ganesha.enable key was set to 'on', it should automatically export the volume via NFS-Ganesha. 3.When ganesha.enable is set to 'on', and a volume is stopped, that volume should be unexported via NFS-Ganesha. 4. gluster vol reset <volname> If ganesha.enable was set to on, then unexport the volume via NFS-Ganesha. 5. gluster vol reset all If features.ganesha is set to enable, as part of reset all, set it to disable. This translates to teardown cluster. All the above problems are fixed by checking the global key and value, depending on the value, specific functions are called. And also, functions related to global commands are moved to cli-cmd-global.c Commit phase of features.ganesha enable/disable runs the ganesha-ha.sh setup/teardown respectively. Before the script begins, it is important that the NFS-Ganesha service starts on all the HA nodes. Having the start service commands in the commit phase could lead to problems. Moving the pre-requisite service start commands to the 'stage' phase. Change-Id: I9084d004c0aaf960f59ed8aa2d7f1c9309924658 BUG: 1217793 Signed-off-by: Meghana Madhusudhan <mmadhusu@redhat.com> Reviewed-on: http://review.gluster.org/10489 Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com> Tested-by: NetBSD Build System Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Niels de Vos <ndevos@redhat.com>
Diffstat (limited to 'cli')
-rw-r--r--cli/src/Makefile.am2
-rw-r--r--cli/src/cli-cmd-global.c131
-rw-r--r--cli/src/cli-cmd-misc.c3
-rw-r--r--cli/src/cli-cmd-parser.c12
-rw-r--r--cli/src/cli-cmd-volume.c52
-rw-r--r--cli/src/cli-cmd.c6
-rw-r--r--cli/src/cli-cmd.h2
7 files changed, 147 insertions, 61 deletions
diff --git a/cli/src/Makefile.am b/cli/src/Makefile.am
index db1d089b8f9..92cf35a581c 100644
--- a/cli/src/Makefile.am
+++ b/cli/src/Makefile.am
@@ -1,6 +1,6 @@
sbin_PROGRAMS = gluster
-gluster_SOURCES = cli.c registry.c input.c cli-cmd.c cli-rl.c \
+gluster_SOURCES = cli.c registry.c input.c cli-cmd.c cli-rl.c cli-cmd-global.c \
cli-cmd-volume.c cli-cmd-peer.c cli-rpc-ops.c cli-cmd-parser.c\
cli-cmd-system.c cli-cmd-misc.c cli-xml-output.c cli-quotad-client.c cli-cmd-snapshot.c
diff --git a/cli/src/cli-cmd-global.c b/cli/src/cli-cmd-global.c
new file mode 100644
index 00000000000..9b71821b00c
--- /dev/null
+++ b/cli/src/cli-cmd-global.c
@@ -0,0 +1,131 @@
+/*
+ Copyright (c) 2015 Red Hat, Inc. <http://www.redhat.com>
+ This file is part of GlusterFS.
+
+ This file is licensed to you under your choice of the GNU Lesser
+ General Public License, version 3 or any later version (LGPLv3 or
+ later), or the GNU General Public License, version 2 (GPLv2), in all
+ cases as published by the Free Software Foundation.
+*/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <pthread.h>
+
+#include <sys/socket.h>
+#include <netdb.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <netinet/in.h>
+
+#ifndef _CONFIG_H
+#define _CONFIG_H
+#include "config.h"
+#endif
+
+#include "cli.h"
+#include "cli-cmd.h"
+#include "cli-mem-types.h"
+#include "cli1-xdr.h"
+#include "run.h"
+#include "syscall.h"
+#include "common-utils.h"
+
+extern rpc_clnt_prog_t *cli_rpc_prog;
+
+int
+cli_cmd_global_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
+ const char **words, int wordcount);
+int cli_cmd_ganesha_cbk (struct cli_state *state, struct cli_cmd_word *word,
+ const char **words, int wordcount);
+
+
+struct cli_cmd global_cmds[] = {
+ { "global help",
+ cli_cmd_global_help_cbk,
+ "list global commands",
+ },
+ { "nfs-ganesha {enable| disable} ",
+ cli_cmd_ganesha_cbk,
+ "Enable/disable NFS-Ganesha support",
+ },
+ {NULL, NULL, NULL}
+};
+
+int
+cli_cmd_global_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
+ const char **words, int wordcount)
+{
+ struct cli_cmd *cmd = NULL;
+
+ for (cmd = global_cmds; cmd->pattern; cmd++)
+ if (_gf_false == cmd->disable)
+ cli_out ("%s - %s", cmd->pattern, cmd->desc);
+
+ return 0;
+}
+
+int
+cli_cmd_global_register (struct cli_state *state)
+{
+ int ret = 0;
+ struct cli_cmd *cmd = NULL;
+ for (cmd = global_cmds; cmd->pattern; cmd++) {
+ ret = cli_cmd_register (&state->tree, cmd);
+ if (ret)
+ goto out;
+ }
+out:
+ return ret;
+
+}
+
+int cli_cmd_ganesha_cbk (struct cli_state *state, struct cli_cmd_word *word,
+ const char **words, int wordcount)
+
+{
+ int sent = 0;
+ int parse_error = 0;
+ int ret = -1;
+ rpc_clnt_procedure_t *proc = NULL;
+ call_frame_t *frame = NULL;
+ dict_t *options = NULL;
+ cli_local_t *local = NULL;
+ char *op_errstr = NULL;
+
+ proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GANESHA];
+
+ frame = create_frame (THIS, THIS->ctx->pool);
+ if (!frame)
+ goto out;
+
+ ret = cli_cmd_ganesha_parse (state, words, wordcount,
+ &options, &op_errstr);
+ if (ret) {
+ if (op_errstr) {
+ cli_err ("%s", op_errstr);
+ GF_FREE (op_errstr);
+ } else
+ cli_usage_out (word->pattern);
+ parse_error = 1;
+ goto out;
+ }
+
+ CLI_LOCAL_INIT (local, words, frame, options);
+
+ if (proc->fn) {
+ ret = proc->fn (frame, THIS, options);
+ }
+
+out:
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Setting global option failed");
+ }
+
+ CLI_STACK_DESTROY (frame);
+ return ret;
+}
+
diff --git a/cli/src/cli-cmd-misc.c b/cli/src/cli-cmd-misc.c
index 566d7c978d9..ccfeb6d87f1 100644
--- a/cli/src/cli-cmd-misc.c
+++ b/cli/src/cli-cmd-misc.c
@@ -33,6 +33,7 @@ extern struct cli_cmd cli_log_cmds[];
extern struct cli_cmd cli_system_cmds[];
extern struct cli_cmd cli_bd_cmds[];
extern struct cli_cmd snapshot_cmds[];
+extern struct cli_cmd global_cmds[];
struct cli_cmd cli_misc_cmds[];
int
@@ -48,7 +49,7 @@ cli_cmd_display_help (struct cli_state *state, struct cli_cmd_word *in_word,
{
struct cli_cmd *cmd[] = {volume_cmds, cli_probe_cmds,
cli_misc_cmds, snapshot_cmds,
- NULL};
+ global_cmds, NULL};
struct cli_cmd *cmd_ind = NULL;
int i = 0;
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c
index b163b85f95f..38b30a4fe04 100644
--- a/cli/src/cli-cmd-parser.c
+++ b/cli/src/cli-cmd-parser.c
@@ -819,7 +819,7 @@ out:
}
/* Parsing global option for NFS-Ganesha config
- * gluster features.ganesha enable/disable */
+ * gluster nfs-ganesha enable/disable */
int32_t
cli_cmd_ganesha_parse (struct cli_state *state,
@@ -833,7 +833,7 @@ cli_cmd_ganesha_parse (struct cli_state *state,
char *value = NULL;
int i = 0;
char *w = NULL;
- char *opwords[] = { "enable", "disable" };
+ char *opwords[] = { "enable", "disable", NULL };
const char *question = NULL;
gf_answer_t answer = GF_ANSWER_NO;
@@ -853,7 +853,7 @@ cli_cmd_ganesha_parse (struct cli_state *state,
value = (char *) words[1];
if (!key || !value) {
- cli_out ("Usage : features.ganesha <enable/disable>");
+ cli_out ("Usage : nfs-ganesha <enable/disable>");
ret = -1;
goto out;
}
@@ -862,7 +862,7 @@ cli_cmd_ganesha_parse (struct cli_state *state,
if (ret == -1)
goto out;
- if (strcmp (key, "features.ganesha")) {
+ if (strcmp (key, "nfs-ganesha")) {
gf_asprintf (op_errstr, "Global option: error: ' %s '"
"is not a valid global option.", key);
ret = -1;
@@ -872,13 +872,13 @@ cli_cmd_ganesha_parse (struct cli_state *state,
w = str_getunamb (value, opwords);
if (!w) {
cli_out ("Invalid global option \n"
- "Usage : features.ganesha <enable/disable>");
+ "Usage : nfs-ganesha <enable/disable>");
ret = -1;
goto out;
}
question = "Enabling NFS-Ganesha requires Gluster-NFS to be"
- "disabled across the trusted pool. Do you "
+ " disabled across the trusted pool. Do you "
"still want to continue?";
if (strcmp (value, "enable") == 0) {
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c
index 014afad6738..c731284cdfe 100644
--- a/cli/src/cli-cmd-volume.c
+++ b/cli/src/cli-cmd-volume.c
@@ -1382,54 +1382,6 @@ out:
return ret;
}
-int cli_cmd_ganesha_cbk (struct cli_state *state, struct cli_cmd_word *word,
- const char **words, int wordcount)
-
-{
- int sent = 0;
- int parse_error = 0;
- int ret = -1;
- rpc_clnt_procedure_t *proc = NULL;
- call_frame_t *frame = NULL;
- dict_t *options = NULL;
- cli_local_t *local = NULL;
- char *op_errstr = NULL;
-
- proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GANESHA];
-
- frame = create_frame (THIS, THIS->ctx->pool);
- if (!frame)
- goto out;
-
- ret = cli_cmd_ganesha_parse (state, words, wordcount,
- &options, &op_errstr);
- if (ret) {
- if (op_errstr) {
- cli_err ("%s", op_errstr);
- GF_FREE (op_errstr);
- } else
- cli_usage_out (word->pattern);
- parse_error = 1;
- goto out;
- }
-
- CLI_LOCAL_INIT (local, words, frame, options);
-
- if (proc->fn) {
- ret = proc->fn (frame, THIS, options);
- }
-
-out:
- if (ret) {
- cli_cmd_sent_status_get (&sent);
- if ((sent == 0) && (parse_error == 0))
- cli_out ("Setting global option failed");
- }
-
- CLI_STACK_DESTROY (frame);
- return ret;
-}
-
int
cli_cmd_bitrot_cbk (struct cli_state *state, struct cli_cmd_word *word,
const char **words, int wordcount)
@@ -2634,10 +2586,6 @@ struct cli_cmd volume_cmds[] = {
cli_cmd_quota_cbk,
"quota translator specific operations"},
- { "features.ganesha { enable| disable } ",
- cli_cmd_ganesha_cbk,
- "global ganesha operations" },
-
{ "volume top <VOLNAME> {open|read|write|opendir|readdir|clear} [nfs|brick <brick>] [list-cnt <value>] |\n"
"volume top <VOLNAME> {read-perf|write-perf} [bs <size> count <count>] [brick <brick>] [list-cnt <value>]",
cli_cmd_volume_top_cbk,
diff --git a/cli/src/cli-cmd.c b/cli/src/cli-cmd.c
index cc9072246d3..5ea1edc9cac 100644
--- a/cli/src/cli-cmd.c
+++ b/cli/src/cli-cmd.c
@@ -234,6 +234,9 @@ cli_cmds_register (struct cli_state *state)
ret = cli_cmd_snapshot_register (state);
if (ret)
goto out;
+ ret = cli_cmd_global_register (state);
+ if (ret)
+ goto out;
out:
return ret;
}
@@ -371,7 +374,8 @@ cli_cmd_submit (struct rpc_clnt* rpc, void *req, call_frame_t *frame,
unsigned timeout = 0;
if ((GLUSTER_CLI_PROFILE_VOLUME == procnum) ||
- (GLUSTER_CLI_HEAL_VOLUME == procnum))
+ (GLUSTER_CLI_HEAL_VOLUME == procnum) ||
+ (GLUSTER_CLI_GANESHA == procnum))
timeout = CLI_TEN_MINUTES_TIMEOUT;
else
timeout = CLI_DEFAULT_CMD_TIMEOUT;
diff --git a/cli/src/cli-cmd.h b/cli/src/cli-cmd.h
index cf036928ddf..d39c8b38f7f 100644
--- a/cli/src/cli-cmd.h
+++ b/cli/src/cli-cmd.h
@@ -84,6 +84,8 @@ int cli_cmd_system_register (struct cli_state *state);
int cli_cmd_snapshot_register (struct cli_state *state);
+int cli_cmd_global_register (struct cli_state *state);
+
int cli_cmd_misc_register (struct cli_state *state);
struct cli_cmd_word *cli_cmd_nextword (struct cli_cmd_word *word,