iscsi: Add JSON config/info dump for target node.
Support JSON config/info dump for target node. These are added to tgt_node.c Text config dump is moved to tgt_node.c too. All accesses to g_spdk_iscsi.target_head are consolidated into tgt_node.c to extract target_head from g_spdk_iscsi. Change-Id: Ibdf57c6ec9457d762c5640483b5810c9a74604ef Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-on: https://review.gerrithub.io/407848 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
24cf63c47a
commit
9114e3a22e
@ -343,83 +343,11 @@ invalid:
|
||||
}
|
||||
SPDK_RPC_REGISTER("delete_initiator_group", spdk_rpc_delete_initiator_group, SPDK_RPC_RUNTIME)
|
||||
|
||||
static void
|
||||
dump_target_node(struct spdk_json_write_ctx *w, struct spdk_iscsi_tgt_node *tgtnode)
|
||||
{
|
||||
struct spdk_iscsi_pg_map *pg_map;
|
||||
struct spdk_iscsi_ig_map *ig_map;
|
||||
int i;
|
||||
|
||||
spdk_json_write_object_begin(w);
|
||||
|
||||
spdk_json_write_name(w, "name");
|
||||
spdk_json_write_string(w, tgtnode->name);
|
||||
|
||||
if (tgtnode->alias) {
|
||||
spdk_json_write_name(w, "alias_name");
|
||||
spdk_json_write_string(w, tgtnode->alias);
|
||||
}
|
||||
|
||||
spdk_json_write_name(w, "pg_ig_maps");
|
||||
spdk_json_write_array_begin(w);
|
||||
TAILQ_FOREACH(pg_map, &tgtnode->pg_map_head, tailq) {
|
||||
TAILQ_FOREACH(ig_map, &pg_map->ig_map_head, tailq) {
|
||||
spdk_json_write_object_begin(w);
|
||||
spdk_json_write_name(w, "pg_tag");
|
||||
spdk_json_write_int32(w, pg_map->pg->tag);
|
||||
spdk_json_write_name(w, "ig_tag");
|
||||
spdk_json_write_int32(w, ig_map->ig->tag);
|
||||
spdk_json_write_object_end(w);
|
||||
}
|
||||
}
|
||||
spdk_json_write_array_end(w);
|
||||
|
||||
spdk_json_write_name(w, "luns");
|
||||
spdk_json_write_array_begin(w);
|
||||
for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) {
|
||||
struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(tgtnode->dev, i);
|
||||
|
||||
if (lun) {
|
||||
spdk_json_write_object_begin(w);
|
||||
spdk_json_write_name(w, "bdev_name");
|
||||
spdk_json_write_string(w, spdk_scsi_lun_get_bdev_name(lun));
|
||||
spdk_json_write_name(w, "id");
|
||||
spdk_json_write_int32(w, spdk_scsi_lun_get_id(lun));
|
||||
spdk_json_write_object_end(w);
|
||||
}
|
||||
}
|
||||
spdk_json_write_array_end(w);
|
||||
|
||||
spdk_json_write_name(w, "queue_depth");
|
||||
spdk_json_write_int32(w, tgtnode->queue_depth);
|
||||
|
||||
spdk_json_write_name(w, "disable_chap");
|
||||
spdk_json_write_bool(w, tgtnode->disable_chap);
|
||||
|
||||
spdk_json_write_name(w, "require_chap");
|
||||
spdk_json_write_bool(w, tgtnode->require_chap);
|
||||
|
||||
spdk_json_write_name(w, "mutual_chap");
|
||||
spdk_json_write_bool(w, tgtnode->mutual_chap);
|
||||
|
||||
spdk_json_write_name(w, "chap_group");
|
||||
spdk_json_write_int32(w, tgtnode->chap_group);
|
||||
|
||||
spdk_json_write_name(w, "header_digest");
|
||||
spdk_json_write_bool(w, tgtnode->header_digest);
|
||||
|
||||
spdk_json_write_name(w, "data_digest");
|
||||
spdk_json_write_bool(w, tgtnode->data_digest);
|
||||
|
||||
spdk_json_write_object_end(w);
|
||||
}
|
||||
|
||||
static void
|
||||
spdk_rpc_get_target_nodes(struct spdk_jsonrpc_request *request,
|
||||
const struct spdk_json_val *params)
|
||||
{
|
||||
struct spdk_json_write_ctx *w;
|
||||
struct spdk_iscsi_tgt_node *tgtnode;
|
||||
|
||||
if (params != NULL) {
|
||||
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
|
||||
@ -433,11 +361,7 @@ spdk_rpc_get_target_nodes(struct spdk_jsonrpc_request *request,
|
||||
}
|
||||
|
||||
spdk_json_write_array_begin(w);
|
||||
|
||||
TAILQ_FOREACH(tgtnode, &g_spdk_iscsi.target_head, tailq) {
|
||||
dump_target_node(w, tgtnode);
|
||||
}
|
||||
|
||||
spdk_iscsi_tgt_nodes_info_json(w);
|
||||
spdk_json_write_array_end(w);
|
||||
|
||||
spdk_jsonrpc_end_result(request, w);
|
||||
|
@ -214,105 +214,6 @@ spdk_iscsi_config_dump_initiator_groups(FILE *fp)
|
||||
}
|
||||
}
|
||||
|
||||
/* Target nodes */
|
||||
static const char *target_nodes_section = \
|
||||
"\n"
|
||||
"# Users should change the TargetNode section(s) below to match the\n"
|
||||
"# desired iSCSI target node configuration.\n"
|
||||
"# TargetName, Mapping, LUN0 are minimum required\n";
|
||||
|
||||
#define TARGET_NODE_TMPL \
|
||||
"[TargetNode%d]\n" \
|
||||
" Comment \"Target%d\"\n" \
|
||||
" TargetName %s\n" \
|
||||
" TargetAlias \"%s\"\n"
|
||||
|
||||
#define TARGET_NODE_PGIG_MAPPING_TMPL \
|
||||
" Mapping PortalGroup%d InitiatorGroup%d\n"
|
||||
|
||||
#define TARGET_NODE_AUTH_TMPL \
|
||||
" AuthMethod %s\n" \
|
||||
" AuthGroup %s\n" \
|
||||
" UseDigest %s\n"
|
||||
|
||||
#define TARGET_NODE_QD_TMPL \
|
||||
" QueueDepth %d\n\n"
|
||||
|
||||
#define TARGET_NODE_LUN_TMPL \
|
||||
" LUN%d %s\n"
|
||||
|
||||
static void
|
||||
spdk_iscsi_config_dump_target_nodes(FILE *fp)
|
||||
{
|
||||
int l = 0;
|
||||
struct spdk_scsi_dev *dev = NULL;
|
||||
struct spdk_iscsi_tgt_node *target = NULL;
|
||||
struct spdk_iscsi_pg_map *pg_map;
|
||||
struct spdk_iscsi_ig_map *ig_map;
|
||||
|
||||
/* Create target nodes section */
|
||||
fprintf(fp, "%s", target_nodes_section);
|
||||
|
||||
TAILQ_FOREACH(target, &g_spdk_iscsi.target_head, tailq) {
|
||||
int idx;
|
||||
const char *authmethod = "None";
|
||||
char authgroup[32] = "None";
|
||||
const char *usedigest = "Auto";
|
||||
|
||||
dev = target->dev;
|
||||
if (NULL == dev) { continue; }
|
||||
|
||||
idx = target->num;
|
||||
fprintf(fp, TARGET_NODE_TMPL, idx, idx, target->name, spdk_scsi_dev_get_name(dev));
|
||||
|
||||
TAILQ_FOREACH(pg_map, &target->pg_map_head, tailq) {
|
||||
TAILQ_FOREACH(ig_map, &pg_map->ig_map_head, tailq) {
|
||||
fprintf(fp, TARGET_NODE_PGIG_MAPPING_TMPL,
|
||||
pg_map->pg->tag,
|
||||
ig_map->ig->tag);
|
||||
}
|
||||
}
|
||||
|
||||
if (target->disable_chap) {
|
||||
authmethod = "None";
|
||||
} else if (!target->require_chap) {
|
||||
authmethod = "Auto";
|
||||
} else if (target->mutual_chap) {
|
||||
authmethod = "CHAP Mutual";
|
||||
} else {
|
||||
authmethod = "CHAP";
|
||||
}
|
||||
|
||||
if (target->chap_group > 0) {
|
||||
snprintf(authgroup, sizeof(authgroup), "AuthGroup%d", target->chap_group);
|
||||
}
|
||||
|
||||
if (target->header_digest) {
|
||||
usedigest = "Header";
|
||||
} else if (target->data_digest) {
|
||||
usedigest = "Data";
|
||||
}
|
||||
|
||||
fprintf(fp, TARGET_NODE_AUTH_TMPL,
|
||||
authmethod, authgroup, usedigest);
|
||||
|
||||
for (l = 0; l < SPDK_SCSI_DEV_MAX_LUN; l++) {
|
||||
struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(dev, l);
|
||||
|
||||
if (!lun) {
|
||||
continue;
|
||||
}
|
||||
|
||||
fprintf(fp, TARGET_NODE_LUN_TMPL,
|
||||
spdk_scsi_lun_get_id(lun),
|
||||
spdk_scsi_lun_get_bdev_name(lun));
|
||||
}
|
||||
|
||||
fprintf(fp, TARGET_NODE_QD_TMPL,
|
||||
target->queue_depth);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
spdk_mobj_ctor(struct spdk_mempool *mp, __attribute__((unused)) void *arg,
|
||||
void *_m, __attribute__((unused)) unsigned i)
|
||||
@ -1113,7 +1014,7 @@ spdk_iscsi_config_text(FILE *fp)
|
||||
spdk_iscsi_config_dump_section(fp);
|
||||
spdk_iscsi_config_dump_portal_groups(fp);
|
||||
spdk_iscsi_config_dump_initiator_groups(fp);
|
||||
spdk_iscsi_config_dump_target_nodes(fp);
|
||||
spdk_iscsi_tgt_nodes_config_text(fp);
|
||||
}
|
||||
|
||||
SPDK_LOG_REGISTER_COMPONENT("iscsi", SPDK_LOG_ISCSI)
|
||||
|
@ -1331,3 +1331,208 @@ spdk_iscsi_tgt_node_add_lun(struct spdk_iscsi_tgt_node *target,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *target_nodes_section = \
|
||||
"\n"
|
||||
"# Users should change the TargetNode section(s) below to match the\n"
|
||||
"# desired iSCSI target node configuration.\n"
|
||||
"# TargetName, Mapping, LUN0 are minimum required\n";
|
||||
|
||||
#define TARGET_NODE_TMPL \
|
||||
"[TargetNode%d]\n" \
|
||||
" Comment \"Target%d\"\n" \
|
||||
" TargetName %s\n" \
|
||||
" TargetAlias \"%s\"\n"
|
||||
|
||||
#define TARGET_NODE_PGIG_MAPPING_TMPL \
|
||||
" Mapping PortalGroup%d InitiatorGroup%d\n"
|
||||
|
||||
#define TARGET_NODE_AUTH_TMPL \
|
||||
" AuthMethod %s\n" \
|
||||
" AuthGroup %s\n" \
|
||||
" UseDigest %s\n"
|
||||
|
||||
#define TARGET_NODE_QD_TMPL \
|
||||
" QueueDepth %d\n\n"
|
||||
|
||||
#define TARGET_NODE_LUN_TMPL \
|
||||
" LUN%d %s\n"
|
||||
|
||||
void
|
||||
spdk_iscsi_tgt_nodes_config_text(FILE *fp)
|
||||
{
|
||||
int l = 0;
|
||||
struct spdk_scsi_dev *dev = NULL;
|
||||
struct spdk_iscsi_tgt_node *target = NULL;
|
||||
struct spdk_iscsi_pg_map *pg_map;
|
||||
struct spdk_iscsi_ig_map *ig_map;
|
||||
|
||||
/* Create target nodes section */
|
||||
fprintf(fp, "%s", target_nodes_section);
|
||||
|
||||
TAILQ_FOREACH(target, &g_spdk_iscsi.target_head, tailq) {
|
||||
int idx;
|
||||
const char *authmethod = "None";
|
||||
char authgroup[32] = "None";
|
||||
const char *usedigest = "Auto";
|
||||
|
||||
dev = target->dev;
|
||||
if (NULL == dev) { continue; }
|
||||
|
||||
idx = target->num;
|
||||
fprintf(fp, TARGET_NODE_TMPL, idx, idx, target->name, spdk_scsi_dev_get_name(dev));
|
||||
|
||||
TAILQ_FOREACH(pg_map, &target->pg_map_head, tailq) {
|
||||
TAILQ_FOREACH(ig_map, &pg_map->ig_map_head, tailq) {
|
||||
fprintf(fp, TARGET_NODE_PGIG_MAPPING_TMPL,
|
||||
pg_map->pg->tag,
|
||||
ig_map->ig->tag);
|
||||
}
|
||||
}
|
||||
|
||||
if (target->disable_chap) {
|
||||
authmethod = "None";
|
||||
} else if (!target->require_chap) {
|
||||
authmethod = "Auto";
|
||||
} else if (target->mutual_chap) {
|
||||
authmethod = "CHAP Mutual";
|
||||
} else {
|
||||
authmethod = "CHAP";
|
||||
}
|
||||
|
||||
if (target->chap_group > 0) {
|
||||
snprintf(authgroup, sizeof(authgroup), "AuthGroup%d", target->chap_group);
|
||||
}
|
||||
|
||||
if (target->header_digest) {
|
||||
usedigest = "Header";
|
||||
} else if (target->data_digest) {
|
||||
usedigest = "Data";
|
||||
}
|
||||
|
||||
fprintf(fp, TARGET_NODE_AUTH_TMPL,
|
||||
authmethod, authgroup, usedigest);
|
||||
|
||||
for (l = 0; l < SPDK_SCSI_DEV_MAX_LUN; l++) {
|
||||
struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(dev, l);
|
||||
|
||||
if (!lun) {
|
||||
continue;
|
||||
}
|
||||
|
||||
fprintf(fp, TARGET_NODE_LUN_TMPL,
|
||||
spdk_scsi_lun_get_id(lun),
|
||||
spdk_scsi_lun_get_bdev_name(lun));
|
||||
}
|
||||
|
||||
fprintf(fp, TARGET_NODE_QD_TMPL,
|
||||
target->queue_depth);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
spdk_iscsi_tgt_node_info_json(struct spdk_iscsi_tgt_node *target,
|
||||
struct spdk_json_write_ctx *w)
|
||||
{
|
||||
struct spdk_iscsi_pg_map *pg_map;
|
||||
struct spdk_iscsi_ig_map *ig_map;
|
||||
int i;
|
||||
|
||||
spdk_json_write_object_begin(w);
|
||||
|
||||
spdk_json_write_name(w, "name");
|
||||
spdk_json_write_string(w, target->name);
|
||||
|
||||
if (target->alias) {
|
||||
spdk_json_write_name(w, "alias_name");
|
||||
spdk_json_write_string(w, target->alias);
|
||||
}
|
||||
|
||||
spdk_json_write_name(w, "pg_ig_maps");
|
||||
spdk_json_write_array_begin(w);
|
||||
TAILQ_FOREACH(pg_map, &target->pg_map_head, tailq) {
|
||||
TAILQ_FOREACH(ig_map, &pg_map->ig_map_head, tailq) {
|
||||
spdk_json_write_object_begin(w);
|
||||
spdk_json_write_name(w, "pg_tag");
|
||||
spdk_json_write_int32(w, pg_map->pg->tag);
|
||||
spdk_json_write_name(w, "ig_tag");
|
||||
spdk_json_write_int32(w, ig_map->ig->tag);
|
||||
spdk_json_write_object_end(w);
|
||||
}
|
||||
}
|
||||
spdk_json_write_array_end(w);
|
||||
|
||||
spdk_json_write_name(w, "luns");
|
||||
spdk_json_write_array_begin(w);
|
||||
for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) {
|
||||
struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(target->dev, i);
|
||||
|
||||
if (lun) {
|
||||
spdk_json_write_object_begin(w);
|
||||
spdk_json_write_name(w, "bdev_name");
|
||||
spdk_json_write_string(w, spdk_scsi_lun_get_bdev_name(lun));
|
||||
spdk_json_write_name(w, "id");
|
||||
spdk_json_write_int32(w, spdk_scsi_lun_get_id(lun));
|
||||
spdk_json_write_object_end(w);
|
||||
}
|
||||
}
|
||||
spdk_json_write_array_end(w);
|
||||
|
||||
spdk_json_write_name(w, "queue_depth");
|
||||
spdk_json_write_int32(w, target->queue_depth);
|
||||
|
||||
spdk_json_write_name(w, "disable_chap");
|
||||
spdk_json_write_bool(w, target->disable_chap);
|
||||
|
||||
spdk_json_write_name(w, "require_chap");
|
||||
spdk_json_write_bool(w, target->require_chap);
|
||||
|
||||
spdk_json_write_name(w, "mutual_chap");
|
||||
spdk_json_write_bool(w, target->mutual_chap);
|
||||
|
||||
spdk_json_write_name(w, "chap_group");
|
||||
spdk_json_write_int32(w, target->chap_group);
|
||||
|
||||
spdk_json_write_name(w, "header_digest");
|
||||
spdk_json_write_bool(w, target->header_digest);
|
||||
|
||||
spdk_json_write_name(w, "data_digest");
|
||||
spdk_json_write_bool(w, target->data_digest);
|
||||
|
||||
spdk_json_write_object_end(w);
|
||||
}
|
||||
|
||||
static void
|
||||
spdk_iscsi_tgt_node_config_json(struct spdk_iscsi_tgt_node *target,
|
||||
struct spdk_json_write_ctx *w)
|
||||
{
|
||||
spdk_json_write_object_begin(w);
|
||||
|
||||
spdk_json_write_name(w, "method");
|
||||
spdk_json_write_string(w, "construct_target_node");
|
||||
|
||||
spdk_json_write_name(w, "params");
|
||||
spdk_iscsi_tgt_node_info_json(target, w);
|
||||
|
||||
spdk_json_write_object_end(w);
|
||||
}
|
||||
|
||||
void
|
||||
spdk_iscsi_tgt_nodes_info_json(struct spdk_json_write_ctx *w)
|
||||
{
|
||||
struct spdk_iscsi_tgt_node *target;
|
||||
|
||||
TAILQ_FOREACH(target, &g_spdk_iscsi.target_head, tailq) {
|
||||
spdk_iscsi_tgt_node_info_json(target, w);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
spdk_iscsi_tgt_nodes_config_json(struct spdk_json_write_ctx *w)
|
||||
{
|
||||
struct spdk_iscsi_tgt_node *target;
|
||||
|
||||
TAILQ_FOREACH(target, &g_spdk_iscsi.target_head, tailq) {
|
||||
spdk_iscsi_tgt_node_config_json(target, w);
|
||||
}
|
||||
}
|
||||
|
@ -43,6 +43,7 @@ struct spdk_iscsi_conn;
|
||||
struct spdk_iscsi_init_grp;
|
||||
struct spdk_iscsi_portal_grp;
|
||||
struct spdk_iscsi_portal;
|
||||
struct spdk_json_write_ctx;
|
||||
|
||||
#define MAX_TARGET_MAP 256
|
||||
#define SPDK_TN_TAG_MAX 0x0000ffff
|
||||
@ -136,4 +137,7 @@ void spdk_iscsi_tgt_node_delete_map(struct spdk_iscsi_portal_grp *portal_group,
|
||||
struct spdk_iscsi_init_grp *initiator_group);
|
||||
int spdk_iscsi_tgt_node_add_lun(struct spdk_iscsi_tgt_node *target,
|
||||
const char *bdev_name, int lun_id);
|
||||
void spdk_iscsi_tgt_nodes_config_text(FILE *fp);
|
||||
void spdk_iscsi_tgt_nodes_info_json(struct spdk_json_write_ctx *w);
|
||||
void spdk_iscsi_tgt_nodes_config_json(struct spdk_json_write_ctx *w);
|
||||
#endif /* SPDK_ISCSI_TGT_NODE_H_ */
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "../common.c"
|
||||
#include "iscsi/tgt_node.c"
|
||||
#include "scsi/scsi_internal.h"
|
||||
#include "unit/lib/json_mock.c"
|
||||
|
||||
struct spdk_iscsi_globals g_spdk_iscsi;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user