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:
Shuhei Matsumoto 2018-05-04 16:20:02 +09:00 committed by Jim Harris
parent 24cf63c47a
commit 9114e3a22e
5 changed files with 212 additions and 177 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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_ */

View File

@ -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;