137 lines
3.3 KiB
Bash
137 lines
3.3 KiB
Bash
#!/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
|
|
}
|