1*dfc11533SChris Williamson#!/bin/ksh -p
2*dfc11533SChris Williamson#
3*dfc11533SChris Williamson# This file and its contents are supplied under the terms of the
4*dfc11533SChris Williamson# Common Development and Distribution License ("CDDL"), version 1.0.
5*dfc11533SChris Williamson# You may only use this file in accordance with the terms of version
6*dfc11533SChris Williamson# 1.0 of the CDDL.
7*dfc11533SChris Williamson#
8*dfc11533SChris Williamson# A full copy of the text of the CDDL should have accompanied this
9*dfc11533SChris Williamson# source.  A copy of the CDDL is also available via the Internet at
10*dfc11533SChris Williamson# http://www.illumos.org/license/CDDL.
11*dfc11533SChris Williamson#
12*dfc11533SChris Williamson
13*dfc11533SChris Williamson#
14*dfc11533SChris Williamson# Copyright (c) 2016 by Delphix. All rights reserved.
15*dfc11533SChris Williamson#
16*dfc11533SChris Williamson
17*dfc11533SChris Williamson. $STF_SUITE/tests/functional/channel_program/channel_common.kshlib
18*dfc11533SChris Williamson
19*dfc11533SChris Williamson#
20*dfc11533SChris Williamson# DESCRIPTION:
21*dfc11533SChris Williamson#       Listing zfs clones should work correctly.
22*dfc11533SChris Williamson#
23*dfc11533SChris Williamson
24*dfc11533SChris Williamsonverify_runnable "global"
25*dfc11533SChris Williamson
26*dfc11533SChris Williamsonlog_assert "Listing zfs clones should work correctly."
27*dfc11533SChris Williamson
28*dfc11533SChris Williamsonfunction cleanup
29*dfc11533SChris Williamson{
30*dfc11533SChris Williamson	datasetexists $TESTPOOL/$TESTFS@$TESTSNAP && \
31*dfc11533SChris Williamson	    log_must zfs destroy -R $TESTPOOL/$TESTFS@$TESTSNAP
32*dfc11533SChris Williamson}
33*dfc11533SChris Williamson
34*dfc11533SChris Williamsonlog_onexit cleanup
35*dfc11533SChris Williamson
36*dfc11533SChris Williamson# Take snapshot to test with ($TESTSNAP)
37*dfc11533SChris Williamsoncreate_snapshot
38*dfc11533SChris Williamson
39*dfc11533SChris Williamson# 0 clones handled correctly
40*dfc11533SChris Williamsonlog_must_program $TESTPOOL - <<-EOF
41*dfc11533SChris Williamson	n = 0
42*dfc11533SChris Williamson	for s in zfs.list.clones("$TESTPOOL/$TESTFS@$TESTSNAP") do
43*dfc11533SChris Williamson		n = n + 1
44*dfc11533SChris Williamson	end
45*dfc11533SChris Williamson	assert(n == 0)
46*dfc11533SChris Williamson	return 0
47*dfc11533SChris WilliamsonEOF
48*dfc11533SChris Williamson
49*dfc11533SChris Williamson# Create a clone ($TESTCLONE)
50*dfc11533SChris Williamsoncreate_clone
51*dfc11533SChris Williamson
52*dfc11533SChris Williamsonlog_must_program $TESTPOOL - <<-EOF
53*dfc11533SChris Williamson	n = 0
54*dfc11533SChris Williamson	for s in zfs.list.clones("$TESTPOOL/$TESTFS@$TESTSNAP") do
55*dfc11533SChris Williamson		assert(s == "$TESTPOOL/$TESTCLONE")
56*dfc11533SChris Williamson		n = n + 1
57*dfc11533SChris Williamson	end
58*dfc11533SChris Williamson	assert(n == 1)
59*dfc11533SChris Williamson	return 0
60*dfc11533SChris WilliamsonEOF
61*dfc11533SChris Williamson
62*dfc11533SChris WilliamsonTESTCLONE1=${TESTCLONE}-1
63*dfc11533SChris WilliamsonTESTCLONE2=${TESTCLONE}-2
64*dfc11533SChris WilliamsonTESTCLONE3=${TESTCLONE}-3
65*dfc11533SChris Williamsoncreate_clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE1
66*dfc11533SChris Williamsoncreate_clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE2
67*dfc11533SChris Williamsoncreate_clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE3
68*dfc11533SChris Williamson
69*dfc11533SChris Williamson# All clones appear exactly once
70*dfc11533SChris Williamsonlog_must_program $TESTPOOL - <<-EOF
71*dfc11533SChris Williamson	a = {}
72*dfc11533SChris Williamson	a["$TESTPOOL/$TESTCLONE"] = false
73*dfc11533SChris Williamson	a["$TESTPOOL/$TESTCLONE1"] = false
74*dfc11533SChris Williamson	a["$TESTPOOL/$TESTCLONE2"] = false
75*dfc11533SChris Williamson	a["$TESTPOOL/$TESTCLONE3"] = false
76*dfc11533SChris Williamson	n = 0
77*dfc11533SChris Williamson	for s in zfs.list.clones("$TESTPOOL/$TESTFS@$TESTSNAP") do
78*dfc11533SChris Williamson		assert(not a[s])
79*dfc11533SChris Williamson		a[s] = true
80*dfc11533SChris Williamson		n = n + 1
81*dfc11533SChris Williamson	end
82*dfc11533SChris Williamson	assert(n == 4)
83*dfc11533SChris Williamson	assert(a["$TESTPOOL/$TESTCLONE"] and
84*dfc11533SChris Williamson	    a["$TESTPOOL/$TESTCLONE1"] and
85*dfc11533SChris Williamson	    a["$TESTPOOL/$TESTCLONE2"] and
86*dfc11533SChris Williamson	    a["$TESTPOOL/$TESTCLONE3"])
87*dfc11533SChris Williamson	return 0
88*dfc11533SChris WilliamsonEOF
89*dfc11533SChris Williamson
90*dfc11533SChris Williamson# Bad input
91*dfc11533SChris Williamsonlog_mustnot_program $TESTPOOL - <<-EOF
92*dfc11533SChris Williamson	zfs.list.clones("$TESTPOOL/not-a-fs@$TESTSNAP")
93*dfc11533SChris Williamson	return 0
94*dfc11533SChris WilliamsonEOF
95*dfc11533SChris Williamson
96*dfc11533SChris Williamsonlog_mustnot_program $TESTPOOL - <<-EOF
97*dfc11533SChris Williamson	zfs.list.clones("$TESTPOOL/$TESTFS@not-a-snap")
98*dfc11533SChris Williamson	return 0
99*dfc11533SChris WilliamsonEOF
100*dfc11533SChris Williamson
101*dfc11533SChris Williamson# Can't look in a different pool than the one specified on command line
102*dfc11533SChris Williamsonlog_mustnot_program $TESTPOOL - <<-EOF
103*dfc11533SChris Williamson	zfs.list.clones("rpool")
104*dfc11533SChris Williamson	return 0
105*dfc11533SChris WilliamsonEOF
106*dfc11533SChris Williamson
107*dfc11533SChris Williamsonlog_mustnot_program $TESTPOOL - <<-EOF
108*dfc11533SChris Williamson	zfs.list.clones("not-a-pool/$TESTFS@$TESTSNAP")
109*dfc11533SChris Williamson	return 0
110*dfc11533SChris WilliamsonEOF
111*dfc11533SChris Williamson
112*dfc11533SChris Williamsonlog_mustnot_program $TESTPOOL - <<-EOF
113*dfc11533SChris Williamson	zfs.list.clones("$TESTPOOL/$TESTFS")
114*dfc11533SChris Williamson	return 0
115*dfc11533SChris WilliamsonEOF
116*dfc11533SChris Williamson
117*dfc11533SChris Williamsonlog_pass "Listing zfs clones should work correctly."
118