1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
#!/usr/bin/env bats
load helpers
@test "import-layer" {
# The checkdiffs function needs "tar".
if test -z "$(which tar 2> /dev/null)" ; then
skip "need tar"
fi
# Create and populate three interesting layers.
populate
# Extract the layers.
storage diff -u -f $TESTDIR/lower.tar $lowerlayer
storage diff -c -f $TESTDIR/middle.tar $midlayer
storage diff -u -f $TESTDIR/upper.tar $upperlayer
# Delete the layers.
storage delete-layer $upperlayer
storage delete-layer $midlayer
storage delete-layer $lowerlayer
# Import new layers using the layer diffs.
run storage --debug=false import-layer -f $TESTDIR/lower.tar
[ "$status" -eq 0 ]
[ "$output" != "" ]
lowerlayer="$output"
run storage --debug=false import-layer -f $TESTDIR/middle.tar "$lowerlayer"
[ "$status" -eq 0 ]
[ "$output" != "" ]
midlayer="$output"
run storage --debug=false import-layer -f $TESTDIR/upper.tar "$midlayer"
[ "$status" -eq 0 ]
[ "$output" != "" ]
upperlayer="$output"
# The contents of these new layers should match what the old ones had.
checkchanges
checkdiffs
}
set_immutable() {
chflags schg $1
}
reset_immutable() {
chflags noschg $1
}
is_immutable() {
local flags=$(stat -f %#Xf $1)
[ "$((($flags & 0x20000) == 0x20000))" -ne 0 ]
}
@test "import-layer-with-immutable" {
if [ "$OS" != "FreeBSD" ]; then
skip "not supported on $OS"
fi
# Create a layer with a directory containing two files, both
# immutable. The directory is also set as immutablr.
run storage --debug=false create-layer
echo $output
[ "$status" -eq 0 ]
[ "$output" != "" ]
lowerlayer="$output"
run storage --debug=false mount $lowerlayer
[ "$status" -eq 0 ]
[ "$output" != "" ]
local m="$output"
mkdir $m/dir
createrandom $m/dir/layer1file1
createrandom $m/dir/layer1file2
set_immutable $m/dir/layer1file1
set_immutable $m/dir/layer1file2
set_immutable $m/dir
storage unmount $lowerlayer
# Create a second layer which deletes one file and removes immutable from the other
run storage --debug=false create-layer "$lowerlayer"
[ "$status" -eq 0 ]
[ "$output" != "" ]
upperlayer="$output"
run storage --debug=false mount $upperlayer
[ "$status" -eq 0 ]
[ "$output" != "" ]
m="$output"
reset_immutable $m/dir
reset_immutable $m/dir/layer1file1
rm $m/dir/layer1file1
reset_immutable $m/dir/layer1file2
set_immutable $m/dir
storage unmount $upperlayer
# Extract the layers.
storage diff -u -f $TESTDIR/lower.tar $lowerlayer
storage diff -u -f $TESTDIR/upper.tar $upperlayer
# Delete the layers.
storage delete-layer $upperlayer
storage delete-layer $lowerlayer
# Import new layers using the layer diffs.
run storage --debug=false import-layer -f $TESTDIR/lower.tar
[ "$status" -eq 0 ]
[ "$output" != "" ]
lowerlayer="$output"
run storage --debug=false import-layer -f $TESTDIR/upper.tar "$lowerlayer"
[ "$status" -eq 0 ]
[ "$output" != "" ]
upperlayer="$output"
# Verify layer contents
run storage --debug=false mount $lowerlayer
[ "$status" -eq 0 ]
[ "$output" != "" ]
m="$output"
is_immutable $m/dir/layer1file1
is_immutable $m/dir/layer1file2
storage unmount $lowerlayer
run storage --debug=false mount $upperlayer
[ "$status" -eq 0 ]
[ "$output" != "" ]
m="$output"
[ ! -f $m/dir/layer1file1 ]
! is_immutable $m/dir/layer1file2
storage unmount $upperlayer
storage delete-layer $upperlayer
storage delete-layer $lowerlayer
}
|