diff options
Diffstat (limited to 'cli')
| -rw-r--r-- | cli/src/cli-cmd-global.c | 57 | ||||
| -rw-r--r-- | cli/src/cli-cmd-parser.c | 114 | ||||
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 135 | ||||
| -rw-r--r-- | cli/src/cli-xml-output.c | 26 | ||||
| -rw-r--r-- | cli/src/cli.h | 5 | 
5 files changed, 290 insertions, 47 deletions
diff --git a/cli/src/cli-cmd-global.c b/cli/src/cli-cmd-global.c index 53ee0ab2517..f4544da367c 100644 --- a/cli/src/cli-cmd-global.c +++ b/cli/src/cli-cmd-global.c @@ -34,7 +34,9 @@ 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); - +int +cli_cmd_get_state_cbk (struct cli_state *state, struct cli_cmd_word *word, +                              const char **words, int wordcount);  struct cli_cmd global_cmds[] = {          { "global help", @@ -45,6 +47,10 @@ struct cli_cmd global_cmds[] = {             cli_cmd_ganesha_cbk,            "Enable/disable NFS-Ganesha support",          }, +        { "get-state [<daemon>] [odir </path/to/output/dir/>] [file <filename>]", +          cli_cmd_get_state_cbk, +          "Get local state representation of mentioned daemon", +        },          {NULL,  NULL,  NULL}  }; @@ -133,3 +139,52 @@ out:          return ret;  } +int +cli_cmd_get_state_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; + +        frame = create_frame (THIS, THIS->ctx->pool); +        if (!frame) +                goto out; + +        ret = cli_cmd_get_state_parse (state, words, wordcount, &options, +                                       &op_errstr); + +        if (ret) { +                if (op_errstr) { +                        cli_err ("%s", op_errstr); +                        cli_usage_out (word->pattern); +                        GF_FREE (op_errstr); +                } else +                        cli_usage_out (word->pattern); + +                parse_error = 1; +                goto out; +        } + +        CLI_LOCAL_INIT (local, words, frame, options); + +        proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_STATE]; +        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 ("Getting daemon state failed"); +        } + +        CLI_STACK_DESTROY (frame); + +        return ret; +} + diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index b83275bbfd7..20dcda5619e 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -931,6 +931,120 @@ out:  }  int32_t +cli_cmd_get_state_parse (struct cli_state *state, +                         const char **words, int wordcount, +                         dict_t **options, char **op_errstr) +{ +        dict_t    *dict                 = NULL; +        int        ret                  = -1; +        uint32_t   cmd                  = 0; +        char      *odir                 = NULL; +        char      *filename             = NULL; +        char      *daemon_name          = NULL; +        int        count                = 0; + +        GF_VALIDATE_OR_GOTO ("cli", options, out); +        GF_VALIDATE_OR_GOTO ("cli", words, out); + +        dict = dict_new (); +        if (!dict) +                goto out; + +        if (wordcount < 1 || wordcount > 6) { +                *op_errstr = gf_strdup ("Problem parsing arguments." +                                        " Check usage."); +                goto out; +        } + +        if (wordcount >= 1) { +                gf_asprintf (&daemon_name, "%s", "glusterd"); + +                for (count = 1; count < wordcount; count++) { +                        if (strcmp (words[count], "odir") == 0 || +                                        strcmp (words[count], "file") == 0) { +                                if (strcmp (words[count], "odir") == 0) { +                                        if (++count < wordcount) { +                                                odir = (char *) words[count]; +                                                continue; +                                        } else { +                                                ret = -1; +                                                goto out; +                                        } +                                } else if (strcmp (words[count], "file") == 0) { +                                        if (++count < wordcount) { +                                                filename = (char *) words[count]; +                                                continue; +                                        } else { +                                                ret = -1; +                                                goto out; +                                        } +                                } +                        } else { +                                if (count > 1) { +                                        *op_errstr = gf_strdup ("Problem " +                                                        "parsing arguments. " +                                                        "Check usage."); +                                        ret = -1; +                                        goto out; + +                                } +                                if (strcmp (words[count], "glusterd") == 0) { +                                        continue; +                                } else { +                                        *op_errstr = gf_strdup ("glusterd is " +                                                 "the only supported daemon."); +                                        ret = -1; +                                        goto out; +                                } +                        } +                } + +                ret = dict_set_str (dict, "daemon", daemon_name); +                if (ret) { +                        *op_errstr = gf_strdup ("Command failed. Please check " +                                                " log file for more details."); +                        gf_log (THIS->name, GF_LOG_ERROR, +                                "Setting daemon name to dictionary failed"); +                        goto out; +                } + +                if (odir) { +                        ret = dict_set_str (dict, "odir", odir); +                        if (ret) { +                                *op_errstr = gf_strdup ("Command failed. Please" +                                                        " check log file for" +                                                        " more details."); +                                gf_log (THIS->name, GF_LOG_ERROR, +                                        "Setting output directory to" +                                        "dictionary failed"); +                                goto out; +                        } +                } + +                if (filename) { +                        ret = dict_set_str (dict, "filename", filename); +                        if (ret) { +                                *op_errstr = gf_strdup ("Command failed. Please" +                                                        " check log file for" +                                                        " more  details."); +                                gf_log (THIS->name, GF_LOG_ERROR, +                                        "Setting filename to dictionary failed"); +                                goto out; +                        } +                } +        } + + out: +        if (dict) +                *options = dict; + +        if (ret && dict) +                dict_unref (dict); + +        return ret; +} + +int32_t  cli_cmd_inode_quota_parse (const char **words, int wordcount, dict_t **options)  {          dict_t          *dict    = NULL; diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 441f4247c45..a8a26c820dd 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -55,17 +55,6 @@ int32_t  gf_cli_remove_brick (call_frame_t *frame, xlator_t *this,                       void *data); -char *cli_vol_type_str[] = {"Distribute", -                            "Stripe", -                            "Replicate", -                            "Striped-Replicate", -                            "Disperse", -                            "Tier", -                            "Distributed-Stripe", -                            "Distributed-Replicate", -                            "Distributed-Striped-Replicate", -                            "Distributed-Disperse", -                           };  char *cli_vol_status_str[] = {"Created",                                "Started", @@ -503,6 +492,73 @@ out:          return ret;  } +int +gf_cli_get_state_cbk (struct rpc_req *req, struct iovec *iov, +                      int count, void *myframe) +{ +        gf_cli_rsp           rsp            = {0,}; +        int                  ret            = -1; +        dict_t               *dict          = NULL; +        char                 *daemon_name   = NULL; +        char                 *ofilepath     = NULL; + +        GF_VALIDATE_OR_GOTO ("cli", myframe, out); + +        if (-1 == req->rpc_status) { +                goto out; +        } +        ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); +        if (ret < 0) { +                gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, +                        "Failed to decode xdr response"); +                goto out; +        } + +        dict = dict_new (); + +        if (!dict) { +                ret = -1; +                goto out; +        } + +        ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, &dict); +        if (ret) +                goto out; + +        if (rsp.op_ret) { +                if (strcmp (rsp.op_errstr, "")) +                        cli_err ("Failed to get daemon state: %s", rsp.op_errstr); +                else +                        cli_err ("Failed to get daemon state. Check glusterd" +                                 " log file for more details"); +        } else { +                ret = dict_get_str (dict, "daemon", &daemon_name); +                if (ret) +                        gf_log ("cli", GF_LOG_ERROR, "Couldn't get daemon name"); + +                ret = dict_get_str (dict, "ofilepath", &ofilepath); +                if (ret) +                        gf_log ("cli", GF_LOG_ERROR, "Couldn't get filepath"); + +                if (daemon_name && ofilepath) +                        cli_out ("%s state dumped to %s", +                                 daemon_name, ofilepath); +        } + +        ret = rsp.op_ret; + +out: +        free (rsp.dict.dict_val); +        free (rsp.op_errstr); + +        if (dict) +                dict_unref (dict); + +        cli_cmd_broadcast_response (ret); + +        return ret; +} +  void  cli_out_options ( char *substr, char *optstr, char *valstr)  { @@ -725,13 +781,11 @@ gf_cli_print_tier_info (dict_t *dict, int i, int brick_count)          vol_type = hot_type;          hot_dist_count = (hot_replica_count ?                            hot_replica_count : 1); -        if ((hot_type != GF_CLUSTER_TYPE_TIER) && -            (hot_type > 0) && -            (hot_dist_count < hot_brick_count)) -                vol_type = hot_type + GF_CLUSTER_TYPE_MAX - 1; +        vol_type = get_vol_type (hot_type, hot_dist_count, hot_brick_count);          cli_out ("Hot Tier Type : %s", -                 cli_vol_type_str[vol_type]); +                 vol_type_str[vol_type]); +          gf_cli_print_number_of_bricks (hot_type,                          hot_brick_count, hot_dist_count, 0,                          hot_replica_count, 0, 0, 0); @@ -742,14 +796,11 @@ gf_cli_print_tier_info (dict_t *dict, int i, int brick_count)                  goto out;          cli_out ("Cold Tier:"); -        vol_type = cold_type; -        if ((cold_type != GF_CLUSTER_TYPE_TIER) && -            (cold_type > 0) && -            (cold_dist_count < cold_brick_count)) -                vol_type = cold_type + GF_CLUSTER_TYPE_MAX - 1; +        vol_type = get_vol_type (cold_type, cold_dist_count, cold_brick_count);          cli_out ("Cold Tier Type : %s", -                        cli_vol_type_str[vol_type]); +                        vol_type_str[vol_type]); +          gf_cli_print_number_of_bricks (cold_type,                  cold_brick_count,                  cold_dist_count, 0, cold_replica_count, @@ -973,15 +1024,11 @@ xml_output:                  if (ret)                          goto out; -                vol_type = type; -                  // Distributed (stripe/replicate/stripe-replica) setups -                if ((type != GF_CLUSTER_TYPE_TIER) && (type > 0) && -                    (dist_count < brick_count)) -                       vol_type = type + GF_CLUSTER_TYPE_MAX - 1; +                vol_type = get_vol_type (type, dist_count, brick_count);                  cli_out ("Volume Name: %s", volname); -                cli_out ("Type: %s", cli_vol_type_str[vol_type]); +                cli_out ("Type: %s", vol_type_str[vol_type]);                  cli_out ("Volume ID: %s", volume_id_str);                  cli_out ("Status: %s", cli_vol_status_str[status]);                  cli_out ("Snapshot Count: %d", snap_count); @@ -4151,6 +4198,32 @@ out:  }  int32_t +gf_cli_get_state (call_frame_t *frame, xlator_t *this, void *data) +{ +        gf_cli_req              req =  {{0,},}; +        int                     ret = 0; +        dict_t                  *dict = NULL; + +        char                    *odir       =  NULL; + +        if (!frame || !this ||  !data) { +                ret = -1; +                goto out; +        } + +        dict = data; + +        ret = cli_to_glusterd (&req, frame, gf_cli_get_state_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_GET_STATE, this, cli_rpc_prog, +                               NULL); +out: +        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + +        return ret; +} + +int32_t  gf_cli_get_next_volume (call_frame_t *frame, xlator_t *this,                             void *data)  { @@ -10918,7 +10991,6 @@ cli_to_glusterd (gf_cli_req *req, call_frame_t *frame,          ret = cli_cmd_submit (NULL, req, frame, prog, procnum, iobref, this,                                cbkfn, (xdrproc_t) xdrproc); -  out:          return ret; @@ -11256,7 +11328,7 @@ struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = {          [GLUSTER_CLI_DEPROBE]          = {"DEPROBE_QUERY", gf_cli_deprobe},          [GLUSTER_CLI_LIST_FRIENDS]     = {"LIST_FRIENDS", gf_cli_list_friends},          [GLUSTER_CLI_UUID_RESET]       = {"UUID_RESET", gf_cli3_1_uuid_reset}, -        [GLUSTER_CLI_UUID_GET]       = {"UUID_GET", gf_cli3_1_uuid_get}, +        [GLUSTER_CLI_UUID_GET]         = {"UUID_GET", gf_cli3_1_uuid_get},          [GLUSTER_CLI_CREATE_VOLUME]    = {"CREATE_VOLUME", gf_cli_create_volume},          [GLUSTER_CLI_DELETE_VOLUME]    = {"DELETE_VOLUME", gf_cli_delete_volume},          [GLUSTER_CLI_START_VOLUME]     = {"START_VOLUME", gf_cli_start_volume}, @@ -11297,7 +11369,8 @@ struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = {          [GLUSTER_CLI_BITROT]           = {"BITROT", gf_cli_bitrot},          [GLUSTER_CLI_ATTACH_TIER]      = {"ATTACH_TIER", gf_cli_attach_tier},          [GLUSTER_CLI_DETACH_TIER]      = {"DETACH_TIER", gf_cli_detach_tier}, -        [GLUSTER_CLI_TIER]             = {"TIER", gf_cli_tier} +        [GLUSTER_CLI_TIER]             = {"TIER", gf_cli_tier}, +        [GLUSTER_CLI_GET_STATE]        = {"GET_STATE", gf_cli_get_state}  };  struct rpc_clnt_program cli_prog = { diff --git a/cli/src/cli-xml-output.c b/cli/src/cli-xml-output.c index f6158eab794..a91e5e435af 100644 --- a/cli/src/cli-xml-output.c +++ b/cli/src/cli-xml-output.c @@ -2720,9 +2720,7 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)                  /* For Distributed-(stripe,replicate,stipe-replicate,disperse)                     types                   */ -                if ((type != GF_CLUSTER_TYPE_TIER) && (type > 0) && -                    (dist_count < brick_count)) -                       type = type + GF_CLUSTER_TYPE_MAX - 1; +                type = get_vol_type (type, dist_count, brick_count);                  ret = xmlTextWriterWriteFormatElement (local->writer,                                                         (xmlChar *)"type", @@ -2732,7 +2730,7 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)                  ret = xmlTextWriterWriteFormatElement (local->writer,                                                         (xmlChar *)"typeStr",                                                         "%s", -                                                       cli_vol_type_str[type]); +                                                       vol_type_str[type]);                  XML_RET_CHECK_AND_GOTO (ret, out);                  memset (key, 0, sizeof (key)); @@ -2819,9 +2817,13 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)                                          goto out;                          } -                        tier_vol_type = value[HOT_TYPE];                          hot_dist_count = (value[HOT_REPLICA_COUNT] ?                                            value[HOT_REPLICA_COUNT] : 1); + +                        tier_vol_type = get_vol_type (value[HOT_TYPE], +                                                      hot_dist_count, +                                                      value[HOT_BRICK_COUNT]); +                          if ((value[HOT_TYPE] != GF_CLUSTER_TYPE_TIER) &&                              (value[HOT_TYPE] > 0) &&                              (hot_dist_count < value[HOT_BRICK_COUNT])) @@ -2835,7 +2837,7 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)                          ret = xmlTextWriterWriteFormatElement                                  (local->writer, (xmlChar *)"hotBrickType", -                                 "%s", cli_vol_type_str[tier_vol_type]); +                                 "%s", vol_type_str[tier_vol_type]);                          ret = xmlTextWriterWriteFormatElement (local->writer,                                                     (xmlChar *)"hotreplicaCount", @@ -2912,13 +2914,9 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)                          ret = xmlTextWriterEndElement (local->writer);                          XML_RET_CHECK_AND_GOTO (ret, out); -                        tier_vol_type = value[COLD_TYPE]; -                        if ((value[COLD_TYPE] != GF_CLUSTER_TYPE_TIER) && -                            (value[COLD_TYPE] > 0) && -                            (value[COLD_DIST_COUNT] < value[COLD_BRICK_COUNT])) -                                tier_vol_type = value[COLD_TYPE] + -                                        GF_CLUSTER_TYPE_MAX - 1; - +                        tier_vol_type = get_vol_type (value[COLD_TYPE], +                                                      value[COLD_DIST_COUNT], +                                                      value[COLD_BRICK_COUNT]);                          ret = xmlTextWriterStartElement (local->writer,                                                           (xmlChar *) @@ -2927,7 +2925,7 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)                          ret = xmlTextWriterWriteFormatElement                                  (local->writer, (xmlChar *)"coldBrickType", -                                 "%s", cli_vol_type_str[tier_vol_type]); +                                 "%s", vol_type_str[tier_vol_type]);                          ret = xmlTextWriterWriteFormatElement (local->writer,                                          (xmlChar *)"coldreplicaCount", diff --git a/cli/src/cli.h b/cli/src/cli.h index 73fb67289f7..f9c642ee4d0 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -71,7 +71,6 @@ struct cli_cmd_word;  struct cli_cmd_tree;  struct cli_cmd; -extern char *cli_vol_type_str[];  extern char *cli_vol_status_str[];  extern char *cli_vol_task_status_str[]; @@ -261,6 +260,10 @@ cli_cmd_ganesha_parse (struct cli_state *state, const char **words,                         int wordcount, dict_t **options, char **op_errstr);  int32_t +cli_cmd_get_state_parse (struct cli_state *state, const char **words, +                         int wordcount, dict_t **options, char **op_errstr); + +int32_t  cli_cmd_volume_add_brick_parse (const char **words, int wordcount,                                  dict_t **options, int *type);  | 
