File: import-layer.bats

package info (click to toggle)
golang-github-containers-storage 1.59.1%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 4,184 kB
  • sloc: sh: 630; ansic: 389; makefile: 143; awk: 12
file content (136 lines) | stat: -rw-r--r-- 3,392 bytes parent folder | download | duplicates (5)
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
}