summaryrefslogtreecommitdiffstats
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/src/cli-cmd-parser.c57
-rw-r--r--cli/src/cli-cmd-snapshot.c4
-rw-r--r--cli/src/cli-rpc-ops.c37
3 files changed, 91 insertions, 7 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c
index 7c6e3176dc6..d855dbf8a0a 100644
--- a/cli/src/cli-cmd-parser.c
+++ b/cli/src/cli-cmd-parser.c
@@ -197,7 +197,8 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
"end-volume", "all", "volume_not_in_ring",
"description", "force",
"snap-max-hard-limit",
- "snap-max-soft-limit", NULL};
+ "snap-max-soft-limit", "auto-delete",
+ NULL};
char *w = NULL;
int op_count = 0;
int32_t replica_count = 1;
@@ -3612,6 +3613,7 @@ cli_snap_config_parse (const char **words, int wordcount, dict_t *dict,
int8_t config_type = -1;
const char *question = NULL;
unsigned int cmdi = 2;
+ int8_t auto_delete = -1;
/* cmdi is command index, here cmdi is "2" (gluster snapshot config)*/
GF_ASSERT (words);
@@ -3630,9 +3632,11 @@ cli_snap_config_parse (const char **words, int wordcount, dict_t *dict,
goto set;
}
+ /* auto-delete cannot be a volume name */
/* Check whether the 3rd word is volname */
if (strcmp (words[cmdi], "snap-max-hard-limit") != 0
- && strcmp (words[cmdi], "snap-max-soft-limit") != 0) {
+ && strcmp (words[cmdi], "snap-max-soft-limit") != 0
+ && strcmp (words[cmdi], "auto-delete") != 0) {
ret = dict_set_str (dict, "volname", (char *)words[cmdi]);
if (ret) {
gf_log ("cli", GF_LOG_ERROR, "Failed to set volname");
@@ -3690,7 +3694,52 @@ cli_snap_config_parse (const char **words, int wordcount, dict_t *dict,
goto out;
}
soft_limit = 1;
- } else {
+ goto set;
+ }
+
+ if (hard_limit != 1 && (strcmp(words[cmdi], "auto-delete") == 0)) {
+ if (vol_presence == 1) {
+ ret = -1;
+ cli_err ("As of now, auto-delete option cannot be set "
+ "to volumes");
+ gf_log ("cli", GF_LOG_ERROR, "auto-delete option "
+ "cannot be set to volumes");
+ goto out;
+ }
+
+ if (++cmdi >= wordcount) {
+ ret = -1;
+ gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax");
+ goto out;
+ }
+
+ if ((strcmp (words[cmdi], "enable") == 0) ||
+ (strcmp (words[cmdi], "disable") == 0)) {
+ ret = dict_set_str (dict, "auto-delete",
+ (char *)words[cmdi]);
+ if (ret) {
+ gf_log ("cli", GF_LOG_ERROR, "Failed to set "
+ "value of auto-delete in request "
+ "dictionary");
+ goto out;
+ }
+ auto_delete = 1;
+ } else {
+ ret = -1;
+ cli_err ("Please enter a valid value (enable/disable) "
+ "for auto-delete");
+ gf_log ("cli", GF_LOG_ERROR, "Invalid value for "
+ "auto-delete");
+ goto out;
+ }
+
+ if (++cmdi != wordcount) {
+ ret = -1;
+ gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax");
+ goto out;
+ }
+ }
+ else {
ret = -1;
gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax");
goto out;
@@ -3705,7 +3754,7 @@ set:
goto out;
}
- if (config_type == GF_SNAP_CONFIG_TYPE_SET) {
+ if (config_type == GF_SNAP_CONFIG_TYPE_SET && auto_delete != 1) {
conf_vals = snap_confopt_vals;
if (hard_limit && soft_limit) {
question = conf_vals[GF_SNAP_CONFIG_SET_BOTH].question;
diff --git a/cli/src/cli-cmd-snapshot.c b/cli/src/cli-cmd-snapshot.c
index 45fa5673f7a..1fb4e5e634c 100644
--- a/cli/src/cli-cmd-snapshot.c
+++ b/cli/src/cli-cmd-snapshot.c
@@ -102,7 +102,9 @@ struct cli_cmd snapshot_cmds[] = {
cli_cmd_snapshot_cbk,
"Snapshot List."
},
- {"snapshot config [volname] [snap-max-hard-limit <count>] [snap-max-soft-limit <percent>]",
+ {"snapshot config [volname] ([snap-max-hard-limit <count>] "
+ "[snap-max-soft-limit <percent>]) "
+ "| ([auto-delete <enable|disable>])",
cli_cmd_snapshot_cbk,
"Snapshot Config."
},
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c
index b998fff3f4c..348fbe4e2e5 100644
--- a/cli/src/cli-rpc-ops.c
+++ b/cli/src/cli-rpc-ops.c
@@ -7682,6 +7682,7 @@ cli_snapshot_config_display (dict_t *dict, gf_cli_rsp *rsp)
uint64_t soft_limit = 0;
uint64_t i = 0;
uint64_t voldisplaycount = 0;
+ char *auto_delete = NULL;
GF_ASSERT (dict);
GF_ASSERT (rsp);
@@ -7711,8 +7712,11 @@ cli_snapshot_config_display (dict_t *dict, gf_cli_rsp *rsp)
/* Ignore the error, as the key specified is optional */
ret = dict_get_uint64 (dict, "snap-max-soft-limit", &soft_limit);
+ ret = dict_get_str (dict, "auto-delete", &auto_delete);
+
if (!hard_limit && !soft_limit
- && config_command != GF_SNAP_CONFIG_DISPLAY) {
+ && config_command != GF_SNAP_CONFIG_DISPLAY
+ && !auto_delete) {
ret = -1;
gf_log(THIS->name, GF_LOG_ERROR,
"Could not fetch config-key");
@@ -7733,6 +7737,10 @@ cli_snapshot_config_display (dict_t *dict, gf_cli_rsp *rsp)
cli_out ("snapshot config: %s "
"for snap-max-soft-limit set successfully",
volname);
+ } else if (auto_delete) {
+ cli_out ("snapshot config: %s "
+ "auto-delete successfully %sd",
+ volname, auto_delete);
}
break;
@@ -7756,9 +7764,11 @@ cli_snapshot_config_display (dict_t *dict, gf_cli_rsp *rsp)
ret = -1;
goto out;
}
- cli_out ("snap-max-soft-limit : %"PRIu64"%%\n",
+ cli_out ("snap-max-soft-limit : %"PRIu64"%%",
soft_limit);
+ cli_out ("auto-delete : %s\n", auto_delete);
+
cli_out ("Snapshot Volume Configuration:");
ret = dict_get_uint64 (dict, "voldisplaycount",
@@ -8501,6 +8511,8 @@ gf_cli_snapshot_cbk (struct rpc_req *req, struct iovec *iov,
int32_t type = 0;
call_frame_t *frame = NULL;
gf_boolean_t snap_driven = _gf_false;
+ int8_t soft_limit_flag = -1;
+ char *volname = NULL;
if (req->rpc_status == -1) {
ret = -1;
@@ -8550,8 +8562,29 @@ gf_cli_snapshot_cbk (struct rpc_req *req, struct iovec *iov,
"Failed to get snap name");
goto out;
}
+
+ /* TODO : Instead of using volname1 directly use
+ * volname$i in loop once snapshot of multiple
+ * volumes are supported
+ */
+ ret = dict_get_str (dict, "volname1", &volname);
+ if (ret) {
+ gf_log ("cli", GF_LOG_ERROR,
+ "Failed to get volume name");
+ goto out;
+ }
+
cli_out ("snapshot create: success: Snap %s created "
"successfully", snap_name);
+
+ ret = dict_get_int8 (dict, "soft-limit-reach",
+ &soft_limit_flag);
+ if (soft_limit_flag == 1) {
+ cli_out ("Warning: Soft-limit of volume (%s) is "
+ "reached. Snapshot creation is not possible "
+ "once hard-limit is reached.", volname);
+ }
+ ret = 0;
break;
case GF_SNAP_OPTION_TYPE_RESTORE: