Whamcloud - gitweb
LU-18114 nodemap: split "lctl nodemap_*" group into subcommands 07/56207/10
authorEmoly Liu <emoly@whamcloud.com>
Sat, 8 Feb 2025 07:30:01 +0000 (15:30 +0800)
committerOleg Drokin <green@whamcloud.com>
Sat, 22 Feb 2025 23:41:23 +0000 (23:41 +0000)
Split "lctl nodemap_*" command group into subcommands, e.g.
"lctl nodemap_add" to "lctl nodemap add". And "lctl nodemap_*"
commands in sanity-sec.sh are modified to verify this patch.

Also, the old man pages are modified to reflect the new command
format, and the new man page references for lctl-nodemap_xxx.8 are
added to match the old ones.

Test-Parameters: testlist=sanity-sec

Signed-off-by: Emoly Liu <emoly@whamcloud.com>
Change-Id: I165583d95f4a850ce2461c15c56583d64077ef16
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56207
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Sebastien Buisson <sbuisson@ddn.com>
Reviewed-by: Marc Vef <mvef@whamcloud.com>
27 files changed:
lustre/doc/Makefile.am
lustre/doc/lctl-nodemap-activate.8
lustre/doc/lctl-nodemap-add-idmap.8
lustre/doc/lctl-nodemap-add-offset.8
lustre/doc/lctl-nodemap-add-range.8
lustre/doc/lctl-nodemap-add.8
lustre/doc/lctl-nodemap-del-idmap.8
lustre/doc/lctl-nodemap-del-offset.8
lustre/doc/lctl-nodemap-del-range.8
lustre/doc/lctl-nodemap-del.8
lustre/doc/lctl-nodemap-modify.8
lustre/doc/lctl-nodemap-set-fileset.8
lustre/doc/lctl-nodemap-set-sepol.8
lustre/doc/lctl-nodemap_activate.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_add.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_add_idmap.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_add_offset.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_add_range.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_del.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_del_idmap.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_del_offset.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_del_range.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_modify.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_set_fileset.8 [new file with mode: 0644]
lustre/doc/lctl-nodemap_set_sepol.8 [new file with mode: 0644]
lustre/tests/sanity-sec.sh
lustre/utils/lctl.c

index bbe0ce0..e9fc4d7 100644 (file)
@@ -234,17 +234,29 @@ SERVER_MANFILES =                         \
        lctl-llog_remove.8                      \
        lctl-del_ost.8                          \
        lctl-nodemap-activate.8                 \
+       lctl-nodemap_activate.8                 \
        lctl-nodemap-add-idmap.8                \
+       lctl-nodemap_add_idmap.8                \
        lctl-nodemap-add-range.8                \
+       lctl-nodemap_add_range.8                \
        lctl-nodemap-add.8                      \
+       lctl-nodemap_add.8                      \
        lctl-nodemap-del-idmap.8                \
+       lctl-nodemap_del_idmap.8                \
        lctl-nodemap-del-range.8                \
+       lctl-nodemap_del_range.8                \
        lctl-nodemap-del.8                      \
+       lctl-nodemap_del.8                      \
        lctl-nodemap-modify.8                   \
+       lctl-nodemap_modify.8                   \
        lctl-nodemap-set-fileset.8              \
+       lctl-nodemap_set_fileset.8              \
        lctl-nodemap-set-sepol.8                \
+       lctl-nodemap_set_sepol.8                \
        lctl-nodemap-add-offset.8               \
+       lctl-nodemap_add_offset.8               \
        lctl-nodemap-del-offset.8               \
+       lctl-nodemap_del_offset.8               \
        lctl-snapshot-create.8                  \
        lctl-snapshot-destroy.8                 \
        lctl-snapshot-list.8                    \
index 36c1520..16394b8 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_activate \- activate or deactivate the nodemap feature
 .SH SYNOPSIS
 .SY "lctl nodemap_activate"
+or
+.SY "lctl nodemap activate"
 .RB { <0,off,false,f,no,n> | <1,on,true,t,yes,y> }
 .YS
 .SH DESCRIPTION
index 6097c1c..0b551d5 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_add_idmap \- define ID mappings for a nodemap
 .SH SYNOPSIS
 .SY "lctl nodemap_add_idmap"
+or
+.SY "lctl nodemap add_idmap"
 .B --name
 .I NODEMAP_NAME
 .BR --idtype " {" uid | gid | projid }
index 3a2e338..13b90b4 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_add_offset \- define ID mapping offset for a nodemap
 .SH SYNOPSIS
 .SY "lctl nodemap_add_offset"
+or
+.SY "lctl nodemap add_offset"
 .BI --name " NAME"
 .BI --offset " OFFSET"
 .BI --limit  " FSID_COUNT"
index 0a8f1dc..9e10182 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_add_range \- define a range of NIDs for a nodemap
 .SH SYNOPSIS
 .SY "lctl nodemap_add_range"
+or
+.SY "lctl nodemap add_range"
 .BI --name " NODEMAP_NAME"
 .BI --range " NID_RANGE"
 .YS
index 4cfba22..eee2a47 100644 (file)
@@ -2,7 +2,10 @@
 .SH NAME
 lctl-nodemap_add \- create a new nodemap to define client behavior
 .SH SYNOPSIS
-.BR "lctl nodemap_add" " [ " -d "|" --dynamic " ] " \fINODEMAP_NAME
+.SY "lctl nodemap_add"
+or
+.SY "lctl nodemap add"
+.BR "[ " -d "|" --dynamic " ] " \fINODEMAP_NAME
 .br
 .SH DESCRIPTION
 .B nodemap_add
index a149e8b..b326862 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_del_idmap \- delete an existing idmap from a nodemap
 .SH SYNOPSIS
 .SY "lctl nodemap_del_idmap"
+or
+.SY "lctl nodemap del_idmap"
 .BI --name " NODEMAP_NAME"
 .BR --idtype " {" uid | gid | projid }
 .B --idmap
index d670f64..68ff650 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_del_offset \- remove ID mapping offset from a nodemap
 .SH SYNOPSIS
 .SY "lctl nodemap_del_offset"
+or
+.SY "lctl nodemap del_offset"
 .BI --name " NAME"
 .YS
 .SH DESCRIPTION
index 7fcf1a8..37720ba 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_del_range \- delete an existing NID range from a nodemap
 .SH SYNOPSIS
 .SY "lctl nodemap_del_range"
+or
+.SY "lctl nodemap del_range"
 .BI --name " NODEMAP_NAME"
 .BI --range " NID_RANGE"
 .YS
index 8f510a1..e787116 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_del \- delete an existing nodemap
 .SH SYNOPSIS
 .SY "lctl nodemap_del"
+or
+.SY "lctl nodemap del"
 .I NODEMAP_NAME
 .YS
 .SH DESCRIPTION
index e5bd903..d620422 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_modify \- modify a nodemap property
 .SH SYNOPSIS
 .SY "lctl nodemap_modify"
+or
+.SY "lctl nodemap modify"
 .BI --name " NODEMAP_NAME"
 .BI --property " PROPERTY_NAME"
 .BI --value " VALUE"
index 4374c16..7943d19 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_set_fileset \- add a fileset to a nodemap
 .SH SYNOPSIS
 .SY "lctl nodemap_set_fileset"
+or
+.SY "lctl nodemap set_fileset"
 .BI --name " NODEMAP"
 .BI --fileset " SUBDIRECTORY"
 .YS
index dbc30a7..0d86923 100644 (file)
@@ -3,6 +3,8 @@
 lctl-nodemap_set_sepol \- set SELinux policy info on a nodemap
 .SH SYNOPSIS
 .SY "lctl nodemap_set_sepol"
+or
+.SY "lctl nodemap set_sepol"
 .BI --name " NODEMAP"
 .BI --sepol " POLICY"
 .YS
diff --git a/lustre/doc/lctl-nodemap_activate.8 b/lustre/doc/lctl-nodemap_activate.8
new file mode 100644 (file)
index 0000000..681c04b
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-activate.8
diff --git a/lustre/doc/lctl-nodemap_add.8 b/lustre/doc/lctl-nodemap_add.8
new file mode 100644 (file)
index 0000000..8364a61
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-add.8
diff --git a/lustre/doc/lctl-nodemap_add_idmap.8 b/lustre/doc/lctl-nodemap_add_idmap.8
new file mode 100644 (file)
index 0000000..217c61b
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-add-idmap.8
diff --git a/lustre/doc/lctl-nodemap_add_offset.8 b/lustre/doc/lctl-nodemap_add_offset.8
new file mode 100644 (file)
index 0000000..40f8adc
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-add-offset.8
diff --git a/lustre/doc/lctl-nodemap_add_range.8 b/lustre/doc/lctl-nodemap_add_range.8
new file mode 100644 (file)
index 0000000..5e7e800
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-add-range.8
diff --git a/lustre/doc/lctl-nodemap_del.8 b/lustre/doc/lctl-nodemap_del.8
new file mode 100644 (file)
index 0000000..7917847
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-del.8
diff --git a/lustre/doc/lctl-nodemap_del_idmap.8 b/lustre/doc/lctl-nodemap_del_idmap.8
new file mode 100644 (file)
index 0000000..fea7fa9
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-del-idmap.8
diff --git a/lustre/doc/lctl-nodemap_del_offset.8 b/lustre/doc/lctl-nodemap_del_offset.8
new file mode 100644 (file)
index 0000000..058e49c
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-del-offset.8
diff --git a/lustre/doc/lctl-nodemap_del_range.8 b/lustre/doc/lctl-nodemap_del_range.8
new file mode 100644 (file)
index 0000000..743bd9c
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-del-range.8
diff --git a/lustre/doc/lctl-nodemap_modify.8 b/lustre/doc/lctl-nodemap_modify.8
new file mode 100644 (file)
index 0000000..d3cfdba
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-modify.8
diff --git a/lustre/doc/lctl-nodemap_set_fileset.8 b/lustre/doc/lctl-nodemap_set_fileset.8
new file mode 100644 (file)
index 0000000..50c9f02
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-set-fileset.8
diff --git a/lustre/doc/lctl-nodemap_set_sepol.8 b/lustre/doc/lctl-nodemap_set_sepol.8
new file mode 100644 (file)
index 0000000..a427753
--- /dev/null
@@ -0,0 +1 @@
+.so man8/lctl-nodemap-set-sepol.8
index 16cfad7..0c30000 100755 (executable)
@@ -100,6 +100,34 @@ IDENTITY_FLUSH=mdt.$MDT.identity_flush
 
 SAVE_PWD=$PWD
 
+if (( $MDS1_VERSION >= $(version_code 2.16.51) )); then
+       nodemap_activate="nodemap activate"
+       nodemap_add="nodemap add"
+       nodemap_del="nodemap del"
+       nodemap_modify="nodemap modify"
+       nodemap_add_range="nodemap add_range"
+       nodemap_del_range="nodemap del_range"
+       nodemap_add_idmap="nodemap add_idmap"
+       nodemap_del_idmap="nodemap del_idmap"
+       nodemap_test_nid="nodemap test_nid"
+       nodemap_test_id="nodemap test_id"
+       nodemap_set_fileset="nodemap set_fileset"
+       nodemap_set_sepol="nodemap set_sepol"
+else
+       nodemap_activate="nodemap_activate"
+       nodemap_add="nodemap_add"
+       nodemap_del="nodemap_del"
+       nodemap_modify="nodemap_modify"
+       nodemap_add_range="nodemap_add_range"
+       nodemap_del_range="nodemap_del_range"
+       nodemap_add_idmap="nodemap_add_idmap"
+       nodemap_del_idmap="nodemap_del_idmap"
+       nodemap_test_nid="nodemap_test_nid"
+       nodemap_test_id="nodemap_test_id"
+       nodemap_set_fileset="nodemap_set_fileset"
+       nodemap_set_sepol="nodemap_set_sepol"
+fi
+
 sec_login() {
        local user=$1
        local group=$2
@@ -271,10 +299,10 @@ create_nodemaps() {
        for (( i = 0; i < NODEMAP_COUNT; i++ )); do
                local csum=${HOSTNAME_CHECKSUM}_${i}
 
-               do_facet mgs $LCTL nodemap_add $csum
+               do_facet mgs $LCTL $nodemap_add $csum
                rc=$?
                if [ $rc -ne 0 ]; then
-                       echo "nodemap_add $csum failed with $rc"
+                       echo "$nodemap_add $csum failed with $rc"
                        return $rc
                fi
 
@@ -297,8 +325,8 @@ delete_nodemaps() {
        for ((i = 0; i < NODEMAP_COUNT; i++)); do
                local csum=${HOSTNAME_CHECKSUM}_${i}
 
-               if ! do_facet mgs $LCTL nodemap_del $csum; then
-                       error "nodemap_del $csum failed with $?"
+               if ! do_facet mgs $LCTL $nodemap_del $csum; then
+                       error "$nodemap_del $csum failed with $?"
                        return 3
                fi
 
@@ -317,7 +345,7 @@ delete_nodemaps() {
 
 add_range() {
        local j
-       local cmd="$LCTL nodemap_add_range"
+       local cmd="$LCTL $nodemap_add_range"
        local range
        local rc=0
 
@@ -332,7 +360,7 @@ add_range() {
 
 delete_range() {
        local j
-       local cmd="$LCTL nodemap_del_range"
+       local cmd="$LCTL $nodemap_del_range"
        local range
        local rc=0
 
@@ -348,7 +376,7 @@ delete_range() {
 
 add_idmaps() {
        local i
-       local cmd="$LCTL nodemap_add_idmap"
+       local cmd="$LCTL $nodemap_add_idmap"
        local do_proj=true
        local rc=0
 
@@ -386,7 +414,7 @@ add_idmaps() {
 
 add_root_idmaps() {
        local i
-       local cmd="$LCTL nodemap_add_idmap"
+       local cmd="$LCTL $nodemap_add_idmap"
        local rc=0
 
        echo "Start to add root idmaps ..."
@@ -421,7 +449,7 @@ update_idmaps() { #LU-10040
        echo "Start to update idmaps ..."
 
        #Inserting an existed idmap should return error
-       cmd="$LCTL nodemap_add_idmap --name $csum --idtype uid"
+       cmd="$LCTL $nodemap_add_idmap --name $csum --idtype uid"
        if do_facet mgs \
                $cmd --idmap $old_id_client:$old_id_fs 2>/dev/null; then
                error "insert idmap {$old_id_client:$old_id_fs} " \
@@ -454,7 +482,7 @@ update_idmaps() { #LU-10040
                rc=$((rc + 1)); return $rc; }
 
        #Delete above updated idmap
-       cmd="$LCTL nodemap_del_idmap --name $csum --idtype uid"
+       cmd="$LCTL $nodemap_del_idmap --name $csum --idtype uid"
        if ! do_facet mgs $cmd --idmap $new_id:$new_id; then
                error "$cmd --idmap $new_id:$new_id failed"
                rc=$((rc + 1))
@@ -462,7 +490,7 @@ update_idmaps() { #LU-10040
        fi
 
        #restore the idmaps to make delete_idmaps work well
-       cmd="$LCTL nodemap_add_idmap --name $csum --idtype uid"
+       cmd="$LCTL $nodemap_add_idmap --name $csum --idtype uid"
        if ! do_facet mgs $cmd --idmap $old_id_client:$old_id_fs; then
                error "$cmd --idmap $old_id_client:$old_id_fs failed"
                rc=$((rc + 1))
@@ -474,7 +502,7 @@ update_idmaps() { #LU-10040
 
 delete_idmaps() {
        local i
-       local cmd="$LCTL nodemap_del_idmap"
+       local cmd="$LCTL $nodemap_del_idmap"
        local do_proj=true
        local rc=0
 
@@ -512,7 +540,7 @@ delete_idmaps() {
 
 delete_root_idmaps() {
        local i
-       local cmd="$LCTL nodemap_del_idmap"
+       local cmd="$LCTL $nodemap_del_idmap"
        local rc=0
 
        echo "Start to delete root idmaps ..."
@@ -536,7 +564,7 @@ modify_flags() {
        local i
        local proc
        local option
-       local cmd="$LCTL nodemap_modify"
+       local cmd="$LCTL $nodemap_modify"
        local rc=0
 
        proc[0]="admin_nodemap"
@@ -565,9 +593,9 @@ squash_id() {
 
        local cmd
 
-       cmd[0]="$LCTL nodemap_modify --property squash_uid"
-       cmd[1]="$LCTL nodemap_modify --property squash_gid"
-       cmd[2]="$LCTL nodemap_modify --property squash_projid"
+       cmd[0]="$LCTL $nodemap_modify --property squash_uid"
+       cmd[1]="$LCTL $nodemap_modify --property squash_gid"
+       cmd[2]="$LCTL $nodemap_modify --property squash_projid"
 
        if ! do_facet mgs ${cmd[$3]} --name $1 --value $2; then
                return 1
@@ -587,7 +615,7 @@ fi
 test_nid() {
        local cmd
 
-       cmd="$LCTL nodemap_test_nid"
+       cmd="$LCTL $nodemap_test_nid"
 
        nid=$(do_facet mgs $cmd $1)
 
@@ -600,13 +628,13 @@ test_nid() {
 
 cleanup_active() {
        # restore activation state
-       do_facet mgs $LCTL nodemap_activate 0
+       do_facet mgs $LCTL $nodemap_activate 0
        wait_nm_sync active
 }
 
 test_idmap() {
        local i
-       local cmd="$LCTL nodemap_test_id"
+       local cmd="$LCTL $nodemap_test_id"
        local do_root_idmap=true
        local rc=0
 
@@ -614,7 +642,7 @@ test_idmap() {
 
        echo "Start to test idmaps ..."
        ## nodemap deactivated
-       if ! do_facet mgs $LCTL nodemap_activate 0; then
+       if ! do_facet mgs $LCTL $nodemap_activate 0; then
                return 1
        fi
        for ((id = $ID0; id < NODEMAP_MAX_ID; id++)); do
@@ -632,7 +660,7 @@ test_idmap() {
        done
 
        ## nodemap activated
-       if ! do_facet mgs $LCTL nodemap_activate 1; then
+       if ! do_facet mgs $LCTL $nodemap_activate 1; then
                return 2
        fi
 
@@ -653,9 +681,9 @@ test_idmap() {
        for ((i = 0; i < NODEMAP_COUNT; i++)); do
                local csum=${HOSTNAME_CHECKSUM}_${i}
 
-               if ! do_facet mgs $LCTL nodemap_modify --name $csum \
+               if ! do_facet mgs $LCTL $nodemap_modify --name $csum \
                     --property trusted --value 1; then
-                       error "nodemap_modify $csum failed with $?"
+                       error "$nodemap_modify $csum failed with $?"
                        return 3
                fi
        done
@@ -676,9 +704,9 @@ test_idmap() {
        for ((i = 0; i < NODEMAP_COUNT; i++)); do
                local csum=${HOSTNAME_CHECKSUM}_${i}
 
-               if ! do_facet mgs $LCTL nodemap_modify --name $csum     \
+               if ! do_facet mgs $LCTL $nodemap_modify --name $csum    \
                     --property admin --value 1; then
-                       error "nodemap_modify $csum failed with $?"
+                       error "$nodemap_modify $csum failed with $?"
                        return 3
                fi
        done
@@ -716,9 +744,9 @@ test_idmap() {
        for ((i = 0; i < NODEMAP_COUNT; i++)); do
                local csum=${HOSTNAME_CHECKSUM}_${i}
 
-               if ! do_facet mgs $LCTL nodemap_modify --name $csum     \
+               if ! do_facet mgs $LCTL $nodemap_modify --name $csum    \
                                --property admin --value 0; then
-                       error "nodemap_modify ${HOSTNAME_CHECKSUM}_${i} "
+                       error "$nodemap_modify ${HOSTNAME_CHECKSUM}_${i} "
                                "failed with $rc"
                        return 3
                fi
@@ -756,10 +784,10 @@ test_idmap() {
 
        ## reset client trust to 0
        for ((i = 0; i < NODEMAP_COUNT; i++)); do
-               if ! do_facet mgs $LCTL nodemap_modify          \
+               if ! do_facet mgs $LCTL $nodemap_modify         \
                        --name ${HOSTNAME_CHECKSUM}_${i}        \
                        --property trusted --value 0; then
-                       error "nodemap_modify ${HOSTNAME_CHECKSUM}_${i} "
+                       error "$nodemap_modify ${HOSTNAME_CHECKSUM}_${i} "
                                "failed with $rc"
                        return 3
                fi
index b389a91..827045a 100644 (file)
@@ -157,6 +157,63 @@ command_t net_delay_cmdlist[] = {
 };
 JT_SUBCMD(net_delay);
 
+/**
+ * command_t nodemap_cmdlist - lctl nodemap commands.
+ */
+command_t nodemap_cmdlist[] = {
+       {.pc_name = "activate", .pc_func = jt_nodemap_activate,
+        .pc_help = "activate nodemap idmapping functions\n"
+        "usage: nodemap activate {0|1}"},
+       {.pc_name = "add", .pc_func = jt_nodemap_add,
+        .pc_help = "add a new nodemap\n"
+        "usage: nodemap add [-d|--dynamic] NODEMAP_NAME"},
+       {.pc_name = "del", .pc_func = jt_nodemap_del,
+        .pc_help = "remove a nodemap\n"
+        "usage: nodemap del NODEMAP_NAME"},
+       {.pc_name = "add_range", .pc_func = jt_nodemap_add_range,
+        .pc_help = "add a nid range to a nodemap\n"
+        "usage: nodemap add_range --name NODEMAP_NAME --range NID_RANGE"},
+       {.pc_name = "del_range", .pc_func = jt_nodemap_del_range,
+        .pc_help = "delete a nid range from a nodemap\n"
+        "usage: nodemap del_range --name NODEMAP_NAME --range NID_RANGE"},
+       {.pc_name = "modify", .pc_func = jt_nodemap_modify,
+        .pc_help = "modify a nodemap parameters\n"
+        "usage: nodemap modify --name NODEMAP_NAME --property PROPERTY\n"
+        "                      --value VALUE"},
+       {.pc_name = "add_offset", .pc_func = jt_nodemap_add_offset,
+        .pc_help = "add an offset for UID/GID/PROJID mappings\n"
+        "usage: nodemap_add_offset --name NODEMAP_NAME --offset OFFSET\n"
+        "                          --limit LIMIT"},
+       {.pc_name = "del_offset", .pc_func = jt_nodemap_del_offset,
+        .pc_help = "delete an offset for UID/GID/PROJID mappings\n"
+        "usage: nodemap_del_offset --name NODEMAP_NAME"},
+       {.pc_name = "add_idmap", .pc_func = jt_nodemap_add_idmap,
+        .pc_help = "add a UID or GID mapping to a nodemap\n"
+        "usage: nodemap add_idmap --name NAME --idtype {uid|gid|projid}\n"
+        "                         --idmap CLIENTID:FSID"},
+       {.pc_name = "del_idmap", .pc_func = jt_nodemap_del_idmap,
+        .pc_help = "delete a UID or GID mapping from a nodemap\n"
+        "usage: nodemap del_idmap --name NAME --idtype {uid|gid|projid}\n"
+        "                         --idmap CLIENTID:FSID"},
+       {.pc_name = "set_fileset", .pc_func = jt_nodemap_set_fileset,
+        .pc_help = "set a fileset on a nodemap\n"
+        "usage: nodemap set_fileset --name NODEMAP_NAME --fileset FILESET"},
+       {.pc_name = "set_sepol", .pc_func = jt_nodemap_set_sepol,
+        .pc_help = "set SELinux policy info on a nodemap\n"
+        "usage: nodemap set_sepol --name NODEMAP_NAME --sepol SEPOL"},
+       {.pc_name = "test_nid", .pc_func = jt_nodemap_test_nid,
+        .pc_help = "test a nid for nodemap membership\n"
+        "usage: nodemap test_nid NID"},
+       {.pc_name = "test_id", .pc_func = jt_nodemap_test_id,
+        .pc_help = "test a nodemap id pair for mapping\n"
+        "usage: nodemap test_id --nid NID --idtype {uid|gid|projid} --id ID"},
+       {.pc_name = "info", .pc_func = jt_nodemap_info,
+        .pc_help = "print nodemap information\n"
+        "usage: nodemap info {list|nodemap_name|all}"},
+       {.pc_help = NULL }
+};
+JT_SUBCMD(nodemap);
+
 #ifdef HAVE_SERVER_SUPPORT
 /**
  * command_t barrier_cmdlist - lctl barrier commands.
@@ -511,10 +568,10 @@ command_t cmdlist[] = {
         "remove a nodemap\n"
         "usage: nodemap_del NODEMAP_NAME"},
        {"nodemap_add_range", jt_nodemap_add_range, 0,
-        "add a range to a nodemap\n"
+        "add a nid range to a nodemap\n"
         "usage: nodemap_add_range --name NODEMAP_NAME --range NID_RANGE"},
        {"nodemap_del_range", jt_nodemap_del_range, 0,
-        "delete a range from a nodemap\n"
+        "delete a nid range from a nodemap\n"
         "usage: nodemap_del_range --name NODEMAP_NAME --range NID_RANGE"},
        {"nodemap_modify", jt_nodemap_modify, 0,
         "modify a nodemap parameter\n"
@@ -524,13 +581,13 @@ command_t cmdlist[] = {
         "usage: nodemap_add_offset --name NODEMAP_NAME --offset OFFSET --limit LIMIT\n"},
        {"nodemap_del_offset", jt_nodemap_del_offset, 0,
         "delete an offset for UID/GID/PROJID mappings\n"
-        "usage: nodemap_del_offset --name NODEMAP_NAME --offset OFFSET\n"},
+        "usage: nodemap_del_offset --name NODEMAP_NAME\n"},
        {"nodemap_add_idmap", jt_nodemap_add_idmap, 0,
         "add a UID or GID mapping to a nodemap\n"
-        "usage: nodemap_add_idmap --name NODEMAP_NAME --idtype ID_TYPE --idmap CLIENTID:FSID"},
+        "usage: nodemap_add_idmap --name NODEMAP_NAME --idtype {uid|gid|projid} --idmap CLIENTID:FSID"},
        {"nodemap_del_idmap", jt_nodemap_del_idmap, 0,
         "delete a UID or GID mapping from a nodemap\n"
-        "usage: nodemap_del_idmap --name NODEMAP_NAME --idtype ID_TYPE --idmap CLIENTID:FSID"},
+        "usage: nodemap_del_idmap --name NODEMAP_NAME --idtype {uid|gid|projid} --idmap CLIENTID:FSID"},
        {"nodemap_set_fileset", jt_nodemap_set_fileset, 0,
         "set a fileset on a nodemap\n"
         "usage: nodemap_set_fileset --name NODEMAP_NAME --fileset FILESET"},
@@ -538,11 +595,15 @@ command_t cmdlist[] = {
         "set SELinux policy info on a nodemap\n"
         "usage: nodemap_set_sepol --name NODEMAP_NAME --sepol SEPOL"},
        {"nodemap_test_nid", jt_nodemap_test_nid, 0,
+        "test a nid for nodemap membership\n"
         "usage: nodemap_test_nid NID"},
        {"nodemap_test_id", jt_nodemap_test_id, 0,
+        "test a nodemap id pair for mapping\n"
         "Usage: nodemap_test_id --nid NID --idtype ID_TYPE --id ID"},
        {"nodemap_info", jt_nodemap_info, 0,
+        "print nodemap information\n"
         "Usage: nodemap_info [list|nodemap_name|all]"},
+       {"nodemap", jt_nodemap, nodemap_cmdlist, ""},
 
        /* Changelog commands */
        {"===  Changelogs ==", NULL, 0, "changelog user management"},