xref: /freebsd/libexec/nuageinit/tests/nuageinit.sh (revision e9ac41698b2f322d55ccf9da50a3596edb2c1800)
1atf_test_case args
2atf_test_case nocloud
3atf_test_case nocloud_userdata_script
4atf_test_case nocloud_user_data_script
5atf_test_case nocloud_userdata_cloudconfig
6atf_test_case nocloud_userdata_cloudconfig_users
7atf_test_case nocloud_network
8atf_test_case config2
9atf_test_case config2_pubkeys
10atf_test_case config2_pubkeys_user_data
11atf_test_case config2_network
12atf_test_case config2_network_static_v4
13
14
15args_body()
16{
17	atf_check -s exit:1 -e inline:"Usage /usr/libexec/nuageinit <cloud-init directory> [config-2|nocloud]\n" /usr/libexec/nuageinit
18	atf_check -s exit:1 -e inline:"Usage /usr/libexec/nuageinit <cloud-init directory> [config-2|nocloud]\n" /usr/libexec/nuageinit bla
19	atf_check -s exit:1 -e inline:"Usage /usr/libexec/nuageinit <cloud-init directory> [config-2|nocloud]\n" /usr/libexec/nuageinit bla meh plop
20	atf_check -s exit:1 -e inline:"Unknown cloud init type: meh\n" /usr/libexec/nuageinit bla meh
21}
22
23nocloud_body()
24{
25	here=$(pwd)
26	mkdir -p media/nuageinit
27	atf_check -s exit:1 -e match:"nuageinit: error parsing nocloud.*" /usr/libexec/nuageinit ${here}/media/nuageinit/ nocloud
28	export NUAGE_FAKE_ROOTDIR=$(pwd)
29	printf "instance-id: iid-local01\nlocal-hostname: cloudimg\n" > ${here}/media/nuageinit/meta-data
30	atf_check -s exit:0 /usr/libexec/nuageinit ${here}/media/nuageinit nocloud
31	atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
32	cat > media/nuageinit/meta-data << EOF
33instance-id: iid-local01
34hostname: myhost
35EOF
36	atf_check -s exit:0 /usr/libexec/nuageinit ${here}/media/nuageinit nocloud
37	atf_check -o inline:"hostname=\"myhost\"\n" cat etc/rc.conf.d/hostname
38}
39
40nocloud_userdata_script_body()
41{
42	here=$(pwd)
43	mkdir -p media/nuageinit
44	printf "instance-id: iid-local01\n" > ${here}/media/nuageinit/meta-data
45	printf "#!/bin/sh\necho "yeah"\n" > ${here}/media/nuageinit/user-data
46	chmod 755  ${here}/media/nuageinit/user-data
47	atf_check -s exit:0 -o inline:"yeah\n" /usr/libexec/nuageinit ${here}/media/nuageinit nocloud
48}
49
50nocloud_user_data_script_body()
51{
52	here=$(pwd)
53	mkdir -p media/nuageinit
54	printf "instance-id: iid-local01\n" > ${here}/media/nuageinit/meta-data
55	printf "#!/bin/sh\necho "yeah"\n" > ${here}/media/nuageinit/user_data
56	chmod 755  ${here}/media/nuageinit/user_data
57	atf_check -s exit:0 -o inline:"yeah\n" /usr/libexec/nuageinit ${here}/media/nuageinit nocloud
58}
59
60nocloud_userdata_cloudconfig_users_body()
61{
62	here=$(pwd)
63	export NUAGE_FAKE_ROOTDIR=$(pwd)
64	if [ $(id -u) -ne 0 ]; then
65		atf_skip "root required"
66	fi
67	mkdir -p media/nuageinit
68	printf "instance-id: iid-local01\n" > ${here}/media/nuageinit/meta-data
69	mkdir -p etc
70	cat > etc/master.passwd <<EOF
71root:*:0:0::0:0:Charlie &:/root:/bin/csh
72sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
73EOF
74	pwd_mkdb -d etc ${here}/etc/master.passwd
75	cat > etc/group <<EOF
76wheel:*:0:root
77users:*:1:
78EOF
79	cat > media/nuageinit/user-data <<EOF
80#cloud-config
81groups:
82  - admingroup: [root,sys]
83  - cloud-users
84users:
85  - default
86  - name: foobar
87    gecos: Foo B. Bar
88    primary_group: foobar
89    groups: users
90    passwd: $6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/
91EOF
92	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit nocloud
93	cat > expectedgroup << EOF
94wheel:*:0:root,freebsd
95users:*:1:foobar
96admingroup:*:1001:root,sys
97cloud-users:*:1002:
98freebsd:*:1003:
99foobar:*:1004:
100EOF
101	cat > expectedpasswd << EOF
102root:*:0:0::0:0:Charlie &:/root:/bin/csh
103sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
104freebsd:freebsd:1001:1003::0:0:FreeBSD User:/home/freebsd:/bin/sh
105foobar:H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/:1002:1004::0:0:Foo B. Bar:/home/foobar:/bin/sh
106EOF
107	atf_check -o file:expectedpasswd cat ${here}/etc/master.passwd
108	atf_check -o file:expectedgroup cat ${here}/etc/group
109}
110
111nocloud_network_body()
112{
113	here=$(pwd)
114	mkdir -p media/nuageinit
115	mkdir -p etc
116	cat > etc/master.passwd <<EOF
117root:*:0:0::0:0:Charlie &:/root:/bin/csh
118sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
119EOF
120	pwd_mkdb -d etc ${here}/etc/master.passwd
121	cat > etc/group <<EOF
122wheel:*:0:root
123users:*:1:
124EOF
125	if [ $(id -u) -ne 0 ]; then
126		atf_skip "root required"
127	fi
128	mynetworks=$(ifconfig -l ether)
129	if [ -z "$mynetworks" ]; then
130		atf_skip "a network interface is needed"
131	fi
132	set -- $mynetworks
133	myiface=$1
134	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
135	printf "instance-id: iid-local01\n" > ${here}/media/nuageinit/meta-data
136	cat > media/nuageinit/user-data <<EOF
137#cloud-config
138#
139network:
140  version: 2
141  ethernets:
142    # opaque ID for physical interfaces, only referred to by other stanzas
143    id0:
144      match:
145        macaddress: '${myaddr}'
146      addresses:
147        - 192.168.14.2/24
148        - 2001:1::1/64
149      gateway4: 192.168.14.1
150      gateway6: 2001:1::2
151EOF
152	export NUAGE_FAKE_ROOTDIR=$(pwd)
153	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit nocloud
154	cat > network <<EOF
155ifconfig_${myiface}="inet 192.168.14.2/24"
156ifconfig_${myiface}_ipv6="inet6 2001:1::1/64"
157ipv6_network_interfaces="${myiface}"
158ipv6_default_interface="${myiface}"
159EOF
160	cat > routing <<EOF
161defaultrouter="192.168.14.1"
162ipv6_defaultrouter="2001:1::2"
163ipv6_route_${myiface}="2001:1::2 -prefixlen 128 -interface ${myiface}"
164EOF
165	atf_check -o file:network cat ${here}/etc/rc.conf.d/network
166	atf_check -o file:routing cat ${here}/etc/rc.conf.d/routing
167}
168config2_body()
169{
170	here=$(pwd)
171	mkdir -p media/nuageinit
172	atf_check -s exit:1 -e match:"nuageinit: error parsing config-2: meta_data.json.*" /usr/libexec/nuageinit ${here}/media/nuageinit config-2
173	printf "{}" > media/nuageinit/meta_data.json
174	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
175	cat > media/nuageinit/meta_data.json << EOF
176{
177   "hostname": "cloudimg",
178}
179EOF
180	export NUAGE_FAKE_ROOTDIR=$(pwd)
181	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
182	atf_check -o inline:"hostname=\"cloudimg\"\n" cat etc/rc.conf.d/hostname
183}
184
185config2_pubkeys_body()
186{
187	here=$(pwd)
188	export NUAGE_FAKE_ROOTDIR=$(pwd)
189	if [ $(id -u) -ne 0 ]; then
190		atf_skip "root required"
191	fi
192	mkdir -p media/nuageinit
193	touch media/nuageinit/meta_data.json
194	cat > media/nuageinit/user-data << EOF
195#cloud-config
196
197ssh_authorized_keys:
198  - "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
199EOF
200	mkdir -p etc
201	cat > etc/master.passwd <<EOF
202root:*:0:0::0:0:Charlie &:/root:/bin/csh
203sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
204EOF
205	pwd_mkdb -d etc ${here}/etc/master.passwd
206	cat > etc/group <<EOF
207wheel:*:0:root
208users:*:1:
209EOF
210	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
211	atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
212}
213
214
215config2_pubkeys_user_data_body()
216{
217	here=$(pwd)
218	export NUAGE_FAKE_ROOTDIR=$(pwd)
219	if [ $(id -u) -ne 0 ]; then
220		atf_skip "root required"
221	fi
222	mkdir -p media/nuageinit
223	touch media/nuageinit/meta_data.json
224	cat > media/nuageinit/user_data << EOF
225#cloud-config
226
227ssh_authorized_keys:
228  - "ssh-rsa AAAAB3NzaC1y...== Generated by Nova"
229EOF
230	mkdir -p etc
231	cat > etc/master.passwd <<EOF
232root:*:0:0::0:0:Charlie &:/root:/bin/csh
233sys:*:1:0::0:0:Sys:/home/sys:/bin/csh
234EOF
235	pwd_mkdb -d etc ${here}/etc/master.passwd
236	cat > etc/group <<EOF
237wheel:*:0:root
238users:*:1:
239EOF
240	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
241	atf_check -o inline:"ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n" cat home/freebsd/.ssh/authorized_keys
242}
243
244config2_network_body() {
245	here=$(pwd)
246	mkdir -p media/nuageinit
247	printf "{}" > media/nuageinit/meta_data.json
248	mynetworks=$(ifconfig -l ether)
249	if [ -z "$mynetworks" ]; then
250		atf_skip "a network interface is needed"
251	fi
252	set -- $mynetworks
253	myiface=$1
254	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
255cat > media/nuageinit/network_data.json <<EOF
256{
257    "links": [
258        {
259            "ethernet_mac_address": "$myaddr",
260            "id": "iface0",
261            "mtu": null,
262        }
263    ],
264    "networks": [
265        {
266            "id": "network0",
267            "link": "iface0",
268            "type": "ipv4_dhcp"
269        },
270	{ // IPv6
271	"id": "private-ipv4",
272	"type": "ipv6",
273	"link": "iface0",
274	// supports condensed IPv6 with CIDR netmask
275	"ip_address": "2001:cdba::3257:9652/24",
276	"gateway": "fd00::1"
277	"routes": [
278	    {
279		"network": "::",
280		"netmask": "::",
281		"gateway": "fd00::1"
282	},
283	    {
284		"network": "::",
285		"netmask": "ffff:ffff:ffff::",
286		"gateway": "fd00::1:1"
287	},
288	],
289	"network_id": "da5bb487-5193-4a65-a3df-4a0055a8c0d8"
290},
291    ],
292}
293EOF
294	export NUAGE_FAKE_ROOTDIR=$(pwd)
295	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
296	cat > network <<EOF
297ifconfig_${myiface}="DHCP"
298ifconfig_${myiface}_ipv6="inet6 2001:cdba::3257:9652/24"
299ipv6_network_interfaces="${myiface}"
300ipv6_default_interface="${myiface}"
301EOF
302	cat > routing <<EOF
303ipv6_defaultrouter="fd00::1"
304ipv6_route_${myiface}="fd00::1 -prefixlen 128 -interface ${myiface}"
305ipv6_static_routes="${myiface}"
306EOF
307	atf_check -o file:network cat ${here}/etc/rc.conf.d/network
308	atf_check -o file:routing cat ${here}/etc/rc.conf.d/routing
309}
310
311config2_network_static_v4_body() {
312	here=$(pwd)
313	mkdir -p media/nuageinit
314	printf "{}" > media/nuageinit/meta_data.json
315	mynetworks=$(ifconfig -l ether)
316	if [ -z "$mynetworks" ]; then
317		atf_skip "a network interface is needed"
318	fi
319	set -- $mynetworks
320	myiface=$1
321	myaddr=$(ifconfig $myiface ether | awk '/ether/ { print $2 }')
322cat > media/nuageinit/network_data.json <<EOF
323{
324    "links": [
325        {
326            "ethernet_mac_address": "$myaddr",
327            "id": "iface0",
328            "mtu": null,
329        }
330    ],
331    "networks": [
332        {
333            "id": "network0",
334            "link": "iface0",
335            "type": "ipv4"
336            "ip_address": "10.184.0.244",
337            "netmask": "255.255.240.0",
338            "routes": [
339            {
340                "network": "10.0.0.0",
341                "netmask": "255.0.0.0",
342                "gateway": "11.0.0.1"
343            },
344            {
345                "network": "0.0.0.0",
346                "netmask": "0.0.0.0",
347                "gateway": "23.253.157.1"
348            }
349         ]
350     }
351]
352}
353EOF
354
355	export NUAGE_FAKE_ROOTDIR=$(pwd)
356	atf_check /usr/libexec/nuageinit ${here}/media/nuageinit config-2
357	cat > network <<EOF
358ifconfig_${myiface}="inet 10.184.0.244 netmask 255.255.240.0"
359EOF
360	cat > routing <<EOF
361route_cloudinit1_${myiface}="-net 10.0.0.0 11.0.0.1 255.0.0.0"
362defaultrouter="23.253.157.1"
363static_routes="cloudinit1_${myiface}"
364EOF
365	atf_check -o file:network cat ${here}/etc/rc.conf.d/network
366	atf_check -o file:routing cat ${here}/etc/rc.conf.d/routing
367}
368
369atf_init_test_cases()
370{
371	atf_add_test_case args
372	atf_add_test_case nocloud
373	atf_add_test_case nocloud_userdata_script
374	atf_add_test_case nocloud_user_data_script
375	atf_add_test_case nocloud_userdata_cloudconfig_users
376	atf_add_test_case nocloud_network
377	atf_add_test_case config2
378	atf_add_test_case config2_pubkeys
379	atf_add_test_case config2_pubkeys_user_data
380	atf_add_test_case config2_network
381	atf_add_test_case config2_network_static_v4
382}
383