zpool/zfs: allow --json wherever -j is allowed

Mostly so that with the JSON formatting options are also used, they all
look the same. To my eye, `-j --json-flat-vdevs` suggests that they are
different or unrelated, while `--json --json-flat-vdevs` invites no
further questions.

Sponsored-by: Klara, Inc.
Sponsored-by: Wasabi Technology, Inc.
Reviewed-by: Umer Saleem <usaleem@ixsystems.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
Closes #16632
This commit is contained in:
Rob Norris 2024-10-12 03:37:57 +11:00 committed by GitHub
parent b4e4cbeb20
commit 7bf525530a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 72 additions and 33 deletions

View File

@ -2162,6 +2162,7 @@ zfs_do_get(int argc, char **argv)
cb.cb_type = ZFS_TYPE_DATASET; cb.cb_type = ZFS_TYPE_DATASET;
struct option long_options[] = { struct option long_options[] = {
{"json", no_argument, NULL, 'j'},
{"json-int", no_argument, NULL, ZFS_OPTION_JSON_NUMS_AS_INT}, {"json-int", no_argument, NULL, ZFS_OPTION_JSON_NUMS_AS_INT},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
@ -3852,6 +3853,7 @@ zfs_do_list(int argc, char **argv)
nvlist_t *data = NULL; nvlist_t *data = NULL;
struct option long_options[] = { struct option long_options[] = {
{"json", no_argument, NULL, 'j'},
{"json-int", no_argument, NULL, ZFS_OPTION_JSON_NUMS_AS_INT}, {"json-int", no_argument, NULL, ZFS_OPTION_JSON_NUMS_AS_INT},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
@ -7436,9 +7438,15 @@ share_mount(int op, int argc, char **argv)
uint_t nthr; uint_t nthr;
jsobj = data = item = NULL; jsobj = data = item = NULL;
struct option long_options[] = {
{"json", no_argument, NULL, 'j'},
{0, 0, 0, 0}
};
/* check options */ /* check options */
while ((c = getopt(argc, argv, op == OP_MOUNT ? ":ajRlvo:Of" : "al")) while ((c = getopt_long(argc, argv,
!= -1) { op == OP_MOUNT ? ":ajRlvo:Of" : "al",
op == OP_MOUNT ? long_options : NULL, NULL)) != -1) {
switch (c) { switch (c) {
case 'a': case 'a':
do_all = 1; do_all = 1;
@ -8374,8 +8382,14 @@ zfs_do_channel_program(int argc, char **argv)
boolean_t sync_flag = B_TRUE, json_output = B_FALSE; boolean_t sync_flag = B_TRUE, json_output = B_FALSE;
zpool_handle_t *zhp; zpool_handle_t *zhp;
struct option long_options[] = {
{"json", no_argument, NULL, 'j'},
{0, 0, 0, 0}
};
/* check options */ /* check options */
while ((c = getopt(argc, argv, "nt:m:j")) != -1) { while ((c = getopt_long(argc, argv, "nt:m:j", long_options,
NULL)) != -1) {
switch (c) { switch (c) {
case 't': case 't':
case 'm': { case 'm': {
@ -9083,7 +9097,13 @@ zfs_do_version(int argc, char **argv)
int c; int c;
nvlist_t *jsobj = NULL, *zfs_ver = NULL; nvlist_t *jsobj = NULL, *zfs_ver = NULL;
boolean_t json = B_FALSE; boolean_t json = B_FALSE;
while ((c = getopt(argc, argv, "j")) != -1) {
struct option long_options[] = {
{"json", no_argument, NULL, 'j'},
{0, 0, 0, 0}
};
while ((c = getopt_long(argc, argv, "j", long_options, NULL)) != -1) {
switch (c) { switch (c) {
case 'j': case 'j':
json = B_TRUE; json = B_TRUE;

View File

@ -7340,6 +7340,7 @@ zpool_do_list(int argc, char **argv)
current_prop_type = ZFS_TYPE_POOL; current_prop_type = ZFS_TYPE_POOL;
struct option long_options[] = { struct option long_options[] = {
{"json", no_argument, NULL, 'j'},
{"json-int", no_argument, NULL, ZPOOL_OPTION_JSON_NUMS_AS_INT}, {"json-int", no_argument, NULL, ZPOOL_OPTION_JSON_NUMS_AS_INT},
{"json-pool-key-guid", no_argument, NULL, {"json-pool-key-guid", no_argument, NULL,
ZPOOL_OPTION_POOL_KEY_GUID}, ZPOOL_OPTION_POOL_KEY_GUID},
@ -10981,6 +10982,7 @@ zpool_do_status(int argc, char **argv)
struct option long_options[] = { struct option long_options[] = {
{"power", no_argument, NULL, ZPOOL_OPTION_POWER}, {"power", no_argument, NULL, ZPOOL_OPTION_POWER},
{"json", no_argument, NULL, 'j'},
{"json-int", no_argument, NULL, ZPOOL_OPTION_JSON_NUMS_AS_INT}, {"json-int", no_argument, NULL, ZPOOL_OPTION_JSON_NUMS_AS_INT},
{"json-flat-vdevs", no_argument, NULL, {"json-flat-vdevs", no_argument, NULL,
ZPOOL_OPTION_JSON_FLAT_VDEVS}, ZPOOL_OPTION_JSON_FLAT_VDEVS},
@ -12589,6 +12591,7 @@ zpool_do_get(int argc, char **argv)
current_prop_type = cb.cb_type; current_prop_type = cb.cb_type;
struct option long_options[] = { struct option long_options[] = {
{"json", no_argument, NULL, 'j'},
{"json-int", no_argument, NULL, ZPOOL_OPTION_JSON_NUMS_AS_INT}, {"json-int", no_argument, NULL, ZPOOL_OPTION_JSON_NUMS_AS_INT},
{"json-pool-key-guid", no_argument, NULL, {"json-pool-key-guid", no_argument, NULL,
ZPOOL_OPTION_POOL_KEY_GUID}, ZPOOL_OPTION_POOL_KEY_GUID},
@ -13503,7 +13506,12 @@ zpool_do_version(int argc, char **argv)
int c; int c;
nvlist_t *jsobj = NULL, *zfs_ver = NULL; nvlist_t *jsobj = NULL, *zfs_ver = NULL;
boolean_t json = B_FALSE; boolean_t json = B_FALSE;
while ((c = getopt(argc, argv, "j")) != -1) {
struct option long_options[] = {
{"json", no_argument, NULL, 'j'},
};
while ((c = getopt_long(argc, argv, "j", long_options, NULL)) != -1) {
switch (c) { switch (c) {
case 'j': case 'j':
json = B_TRUE; json = B_TRUE;

View File

@ -71,7 +71,7 @@ The following fields are displayed:
Used for scripting mode. Used for scripting mode.
Do not print headers and separate fields by a single tab instead of arbitrary Do not print headers and separate fields by a single tab instead of arbitrary
white space. white space.
.It Fl j Op Ar --json-int .It Fl j , -json Op Ar --json-int
Print the output in JSON format. Print the output in JSON format.
Specify Specify
.Sy --json-int .Sy --json-int

View File

@ -59,7 +59,7 @@
.Xc .Xc
Displays all ZFS file systems currently mounted. Displays all ZFS file systems currently mounted.
.Bl -tag -width "-j" .Bl -tag -width "-j"
.It Fl j .It Fl j , -json
Displays all mounted file systems in JSON format. Displays all mounted file systems in JSON format.
.El .El
.It Xo .It Xo

View File

@ -50,7 +50,7 @@ and any attempts to access or modify other pools will cause an error.
. .
.Sh OPTIONS .Sh OPTIONS
.Bl -tag -width "-t" .Bl -tag -width "-t"
.It Fl j .It Fl j , -json
Display channel program output in JSON format. Display channel program output in JSON format.
When this flag is specified and standard output is empty - When this flag is specified and standard output is empty -
channel program encountered an error. channel program encountered an error.

View File

@ -130,7 +130,7 @@ The value
can be used to display all properties that apply to the given dataset's type can be used to display all properties that apply to the given dataset's type
.Pq Sy filesystem , volume , snapshot , No or Sy bookmark . .Pq Sy filesystem , volume , snapshot , No or Sy bookmark .
.Bl -tag -width "-s source" .Bl -tag -width "-s source"
.It Fl j Op Ar --json-int .It Fl j , -json Op Ar --json-int
Display the output in JSON format. Display the output in JSON format.
Specify Specify
.Sy --json-int .Sy --json-int

View File

@ -98,7 +98,7 @@ See the
.Xr zpoolprops 7 .Xr zpoolprops 7
manual page for more information on the available pool properties. manual page for more information on the available pool properties.
.Bl -tag -compact -offset Ds -width "-o field" .Bl -tag -compact -offset Ds -width "-o field"
.It Fl j Op Ar --json-int, --json-pool-key-guid .It Fl j , -json Op Ar --json-int, --json-pool-key-guid
Display the list of properties in JSON format. Display the list of properties in JSON format.
Specify Specify
.Sy --json-int .Sy --json-int
@ -157,7 +157,7 @@ See the
.Xr vdevprops 7 .Xr vdevprops 7
manual page for more information on the available pool properties. manual page for more information on the available pool properties.
.Bl -tag -compact -offset Ds -width "-o field" .Bl -tag -compact -offset Ds -width "-o field"
.It Fl j Op Ar --json-int .It Fl j , -json Op Ar --json-int
Display the list of properties in JSON format. Display the list of properties in JSON format.
Specify Specify
.Sy --json-int .Sy --json-int

View File

@ -59,7 +59,7 @@ is specified, the command exits after
.Ar count .Ar count
reports are printed. reports are printed.
.Bl -tag -width Ds .Bl -tag -width Ds
.It Fl j Op Ar --json-int, --json-pool-key-guid .It Fl j , -json Op Ar --json-int, --json-pool-key-guid
Display the list of pools in JSON format. Display the list of pools in JSON format.
Specify Specify
.Sy --json-int .Sy --json-int

View File

@ -70,7 +70,7 @@ See the
option of option of
.Nm zpool Cm iostat .Nm zpool Cm iostat
for complete details. for complete details.
.It Fl j Op Ar --json-int, --json-flat-vdevs, --json-pool-key-guid .It Fl j , -json Op Ar --json-int, --json-flat-vdevs, --json-pool-key-guid
Display the status for ZFS pools in JSON format. Display the status for ZFS pools in JSON format.
Specify Specify
.Sy --json-int .Sy --json-int

View File

@ -30,28 +30,39 @@
# STRATEGY: # STRATEGY:
# 1. Run different zfs/zpool -j commands and check for valid JSON # 1. Run different zfs/zpool -j commands and check for valid JSON
#
# -j and --json mean the same thing. Each command will be run twice, replacing
# JSONFLAG with the flag under test.
list=( list=(
"zpool status -j -g --json-int --json-flat-vdevs --json-pool-key-guid" "zpool status JSONFLAG -g --json-int --json-flat-vdevs --json-pool-key-guid"
"zpool status -p -j -g --json-int --json-flat-vdevs --json-pool-key-guid" "zpool status -p JSONFLAG -g --json-int --json-flat-vdevs --json-pool-key-guid"
"zpool status -j -c upath" "zpool status JSONFLAG -c upath"
"zpool status -j" "zpool status JSONFLAG"
"zpool status -j testpool1" "zpool status JSONFLAG testpool1"
"zpool list -j" "zpool list JSONFLAG"
"zpool list -j -g" "zpool list JSONFLAG -g"
"zpool list -j -o fragmentation" "zpool list JSONFLAG -o fragmentation"
"zpool get -j size" "zpool get JSONFLAG size"
"zpool get -j all" "zpool get JSONFLAG all"
"zpool version -j" "zpool version JSONFLAG"
"zfs list -j" "zfs list JSONFLAG"
"zfs list -j testpool1" "zfs list JSONFLAG testpool1"
"zfs get -j all" "zfs get JSONFLAG all"
"zfs get -j available" "zfs get JSONFLAG available"
"zfs mount -j" "zfs mount JSONFLAG"
"zfs version -j" "zfs version JSONFLAG"
) )
for cmd in "${list[@]}" ; do function run_json_tests
log_must eval "$cmd | jq > /dev/null" {
done typeset flag=$1
for cmd in "${list[@]}" ; do
cmd=${cmd//JSONFLAG/$flag}
log_must eval "$cmd | jq > /dev/null"
done
}
log_must run_json_tests -j
log_must run_json_tests --json
log_pass "zpool and zfs commands outputted valid JSON" log_pass "zpool and zfs commands outputted valid JSON"