]> git.proxmox.com Git - mirror_zfs.git/blob - tests/zfs-tests/tests/functional/cli_root/zfs_program/zfs_program_json.ksh
zfs.8 has wrong description of "zfs program -t"
[mirror_zfs.git] / tests / zfs-tests / tests / functional / cli_root / zfs_program / zfs_program_json.ksh
1 #!/bin/ksh -p
2 #
3 # CDDL HEADER START
4 #
5 # This file and its contents are supplied under the terms of the
6 # Common Development and Distribution License ("CDDL"), version 1.0.
7 # You may only use this file in accordance with the terms of version
8 # 1.0 of the CDDL.
9 #
10 # A full copy of the text of the CDDL should have accompanied this
11 # source. A copy is of the CDDL is also available via the Internet
12 # at http://www.illumos.org/license/CDDL.
13 #
14 # CDDL HEADER END
15 #
16
17 #
18 # Copyright (c) 2018 Datto Inc.
19 # Copyright (c) 2019 by Delphix. All rights reserved.
20 #
21
22 . $STF_SUITE/include/libtest.shlib
23
24 #
25 # DESCRIPTION:
26 #
27 # STRATEGY:
28 # 1. Compare JSON output formatting for a channel program to template
29 # 2. Using bad command line option (-Z) gives correct error output
30 #
31
32 verify_runnable "both"
33
34 function cleanup
35 {
36 log_must zfs destroy $TESTDS
37 return 0
38 }
39 log_onexit cleanup
40
41 log_assert "Channel programs output valid JSON"
42
43 TESTDS="$TESTPOOL/zcp-json"
44 log_must zfs create $TESTDS
45
46 TESTZCP="/$TESTDS/zfs_rlist.zcp"
47 cat > "$TESTZCP" << EOF
48 succeeded = {}
49 failed = {}
50
51 function list_recursive(root, prop)
52 for child in zfs.list.children(root) do
53 list_recursive(child, prop)
54 end
55 val, src = zfs.get_prop(root, prop)
56 if (val == nil) then
57 failed[root] = val
58 else
59 succeeded[root] = val
60 end
61 end
62
63 args = ...
64
65 argv = args["argv"]
66
67 list_recursive(argv[1], argv[2])
68
69 results = {}
70 results["succeeded"] = succeeded
71 results["failed"] = failed
72 return results
73 EOF
74
75 # 1. Compare JSON output formatting for a channel program to template
76 typeset -a pos_cmds=("recordsize" "type")
77 typeset -a pos_cmds_out=(
78 "{
79 \"return\": {
80 \"failed\": {},
81 \"succeeded\": {
82 \"$TESTDS\": 131072
83 }
84 }
85 }"
86 "{
87 \"return\": {
88 \"failed\": {},
89 \"succeeded\": {
90 \"$TESTDS\": \"filesystem\"
91 }
92 }
93 }")
94 typeset -i cnt=0
95 typeset cmd
96 for cmd in ${pos_cmds[@]}; do
97 log_must zfs program $TESTPOOL $TESTZCP $TESTDS $cmd 2>&1
98 log_must zfs program $TESTPOOL -j $TESTZCP $TESTDS $cmd 2>&1
99 # json.tool is needed to guarantee consistent ordering of fields
100 # sed is needed to trim trailing space in CentOS 6's json.tool output
101 OUTPUT=$(zfs program $TESTPOOL -j $TESTZCP $TESTDS $cmd 2>&1 | python -m json.tool | sed 's/[[:space:]]*$//')
102 if [ "$OUTPUT" != "${pos_cmds_out[$cnt]}" ]; then
103 log_note "Got :$OUTPUT"
104 log_note "Expected:${pos_cmds_out[$cnt]}"
105 log_fail "Unexpected channel program output";
106 fi
107 cnt=$((cnt + 1))
108 done
109
110 # 2. Using bad command line option (-Z) gives correct error output
111 typeset -a neg_cmds=("-Z")
112 typeset -a neg_cmds_out=(
113 "invalid option 'Z'
114 usage:
115 program [-jn] [-t <instruction limit>] [-m <memory limit (b)>]
116 <pool> <program file> [lua args...]
117
118 For the property list, run: zfs set|get
119
120 For the delegated permission list, run: zfs allow|unallow")
121 cnt=0
122 for cmd in ${neg_cmds[@]}; do
123 log_mustnot zfs program $TESTPOOL $TESTZCP $TESTDS $cmd 2>&1
124 log_mustnot zfs program $TESTPOOL -j $TESTZCP $TESTDS $cmd 2>&1
125 OUTPUT=$(zfs program $TESTPOOL -j $TESTZCP $TESTDS $cmd 2>&1)
126 if [ "$OUTPUT" != "${neg_cmds_out[$cnt]}" ]; then
127 log_note "Got :$OUTPUT"
128 log_note "Expected:${neg_cmds_out[$cnt]}"
129 log_fail "Unexpected channel program error output";
130 fi
131 cnt=$((cnt + 1))
132 done
133
134 log_pass "Channel programs output valid JSON"